\begin{code}
sub split_asm_file {
local($asm_file) = @_;
+ my @pieces = ();
open(TMPI, "< $asm_file") || &tidy_up_and_die(1,"$Pgm: failed to open `$asm_file' (to read)\n");
# grab and de-mangle a section of the .s file...
$s_stuff = &ReadTMPIUpToAMarker ( $_, $octr );
- $this_piece = &process_asm_block ( $s_stuff );
+ $pieces[$octr] = &process_asm_block ( $s_stuff );
+ }
- # output to a file of its own
- # open a new output file...
- $ofname = "${Tmp_prefix}__${octr}.s";
- open(OUTF, "> $ofname") || die "$Pgm: can't open output file: $ofname\n";
+ # Make sure that we still have some output when the input file is empty
+ if ($octr == 0) {
+ $octr = 1;
+ $pieces[$octr] = '';
+ }
- print OUTF $prologue_stuff;
- print OUTF $this_piece;
+ $NoOfSplitFiles = $octr;
- close(OUTF)
- || &tidy_up_and_die(1,"$Pgm:Failed writing ${Tmp_prefix}__${octr}.s\n");
+ if ($pieces[$NoOfSplitFiles] =~ /(\n[ \t]*\.section[ \t]+\.note\.GNU-stack,[^\n]*\n)/) {
+ $note_gnu_stack = $1;
+ for $octr (1..($NoOfSplitFiles - 1)) {
+ $pieces[$octr] .= $note_gnu_stack;
+ }
}
- # Make sure that we still have some output when the input file is empty
- if ( $octr == 0 ) {
- $octr = 1;
+ for $octr (1..$NoOfSplitFiles) {
+ # output to a file of its own
+ # open a new output file...
$ofname = "${Tmp_prefix}__${octr}.s";
open(OUTF, "> $ofname") || die "$Pgm: can't open output file: $ofname\n";
print OUTF $prologue_stuff;
+ print OUTF $pieces[$octr];
close(OUTF)
|| &tidy_up_and_die(1,"$Pgm:Failed writing ${Tmp_prefix}__${octr}.s\n");
}
- $NoOfSplitFiles = $octr;
-
close(TMPI) || &tidy_up_and_die(1,"Failed reading $asm_file\n");
}
while ( 1 ) {
$_ = <TMPI>;
- if ( $_ eq '' || /^L(_.+)\$.+:/ ) {
+ if ( $_ eq '' || (/^L(_.+)\$.+:/ && !(/^L(.*)\$stub_binder:/))) {
if ( $label ne '' ) {
$DyldChunksDefined{$label} .= $section . $alignment . $chunk_label . $ chunk;
if( $section =~ s/\.data/\.non_lazy_symbol_pointer/ ) {
$section = $cur_section;
$alignment = $cur_alignment;
print STDERR "label: $label\n" if $Dump_asm_splitting_info;
- } elsif ( /^\s*\.(symbol_stub|picsymbol_stub|lazy_symbol_pointer|non_lazy_symbol_pointer|data|section __IMPORT,.*)/ ) {
+ } elsif ( /^\s*\.(symbol_stub|picsymbol_stub|lazy_symbol_pointer|non_lazy_symbol_pointer|data|section __IMPORT,.*|section __DATA, __la_sym_ptr(2|3),lazy_symbol_pointers)/ ) {
$cur_section = $_;
printf STDERR "section: $cur_section\n" if $Dump_asm_splitting_info;
$cur_alignment = ''