Have the splitter duplicate the .note.GNU-stack
authorIan Lynagh <igloo@earth.li>
Mon, 8 Jan 2007 12:59:16 +0000 (12:59 +0000)
committerIan Lynagh <igloo@earth.li>
Mon, 8 Jan 2007 12:59:16 +0000 (12:59 +0000)
driver/split/ghc-split.lprl

index 4d159ec..d54e1b2 100644 (file)
@@ -25,6 +25,7 @@ exit(0);
 \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");
 
@@ -54,34 +55,37 @@ sub split_asm_file {
 
        # 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");
 }