[PATCH] ELF: Properly copy and strip Solaris binaries
Alan Modra
amodra@gmail.com
Tue Jan 27 02:06:03 GMT 2026
The following is what is left over from
https://sourceware.org/pipermail/binutils/2025-December/146789.html
Please cast your eye over this HJ, it is mostly your patch. Rainer,
if you commit your ld_supports_emul patch soon I'll update the
"ld -V -m" here before committing.
>From f9078e28c4160c9b9bfbbebabf6fbc26ee24f1b9 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Sat, 27 Dec 2025 09:00:08 +0800
Subject: PR 33718 objcopy and strip of Solaris binaries
non-SHF_ALLOC SHT_SUNW_symsort and SHT_SUNW_symnsort sections aren't
removed when all symbols are removed. Fix that.
binutils/
* objcopy.c (is_strip_section_1): Handle SHT_SUNW_symsort and
SHT_SUNW_symnsort sections.
* testsuite/binutils-all/x86-64/solaris-objcopy.rd,
* testsuite/binutils-all/x86-64/solaris-strip.rd,
* testsuite/binutils-all/x86-64/solaris.so.bz2: New files.
* testsuite/binutils-all/x86-64/x86-64.exp (run_solaris_test): New.
Run the new test.
ld/
* testsuite/ld-i386/solaris-1.d,
* testsuite/ld-x86-64/solaris-1.d,
* testsuite/ld-x86-64/solaris-1.s: New test.
* testsuite/ld-i386/i386.exp: Run it.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index fdd8bd11799..2098c7b5b3e 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -1346,8 +1346,39 @@ is_mergeable_note_section (bfd * abfd, asection * sec)
/* See if a non-group section is being removed. */
static bool
-is_strip_section_1 (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
+is_strip_section_1 (bfd *abfd, asection *sec)
{
+ if (strip_symbols == STRIP_ALL
+ && bfd_get_flavour (abfd) == bfd_target_elf_flavour
+ && elf_elfheader (abfd)->e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
+ {
+ struct bfd_elf_section_data *e = elf_section_data (sec);
+ Elf_Internal_Shdr **sections = elf_elfsections (abfd);
+ switch (e->this_hdr.sh_type)
+ {
+ case SHT_SUNW_symsort:
+ case SHT_SUNW_symnsort:
+ /* On Solaris, non-SHF_ALLOC SHT_SUNW_symsort and
+ SHT_SUNW_symnsort sections are linked with a non-SHF_ALLOC
+ SHT_SYMTAB section. Since strip removes non-SHF_ALLOC
+ SHT_SYMTAB section with STRIP_ALL, also remove non-SHF_ALLOC
+ SHT_SUNW_symsort and SHT_SUNW_symnsort sections. */
+ if ((e->this_hdr.sh_flags & SHF_ALLOC) == 0
+ && sections != NULL
+ && e->this_hdr.sh_link < elf_numsections (abfd))
+ {
+ Elf_Internal_Shdr *l = sections[e->this_hdr.sh_link];
+ if (l->sh_type == SHT_SYMTAB
+ && (l->sh_flags & SHF_ALLOC) == 0)
+ return true;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
if (find_section_list (bfd_section_name (sec), false, SECTION_CONTEXT_KEEP)
!= NULL)
return false;
diff --git a/binutils/testsuite/binutils-all/x86-64/solaris-objcopy.rd b/binutils/testsuite/binutils-all/x86-64/solaris-objcopy.rd
new file mode 100644
index 00000000000..72c522f9b2e
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/solaris-objcopy.rd
@@ -0,0 +1,53 @@
+ELF Header:
+ Magic: 7f 45 4c 46 02 01 01 06 01 00 00 00 00 00 00 00
+ Class: ELF64
+ Data: 2's complement, little endian
+ Version: 1 \(current\)
+ OS/ABI: UNIX - Solaris
+ ABI Version: 1
+ Type: DYN \(Shared object file\)
+ Machine: Advanced Micro Devices X86-64
+ Version: 0x1
+ Entry point address: 0x888
+ Start of program headers: 64 \(bytes into file\)
+ Start of section headers: 3080 \(bytes into file\)
+ Flags: 0x0
+ Size of this header: 64 \(bytes\)
+ Size of program headers: 56 \(bytes\)
+ Number of program headers: 4
+ Size of section headers: 64 \(bytes\)
+ Number of section headers: 24
+ Section header string table index: 23
+
+Section Headers:
+ \[Nr\] Name Type Address Off Size ES Flg Lk Inf Al
+ \[ 0\] NULL 0000000000000000 000000 000000 00 0 0 0
+ \[ 1\] .dynamic DYNAMIC 0000000000000120 000120 000240 10 A 7 0 8
+ \[ 2\] .eh_frame_hdr X86_64_UNWIND 0000000000000360 000360 000014 00 A 0 0 8
+ \[ 3\] .eh_frame X86_64_UNWIND 0000000000000378 000378 000038 00 A 0 0 8
+ \[ 4\] .hash HASH 00000000000003b0 0003b0 00005c 04 A 6 0 8
+ \[ 5\] .SUNW_ldynsym SUNW_LDYNSYM 0000000000000410 000410 000048 18 A 7 3 8
+ \[ 6\] .dynsym DYNSYM 0000000000000458 000458 0000f0 18 A 7 1 8
+ \[ 7\] .dynstr STRTAB 0000000000000548 000548 00028c 00 AS 0 0 1
+ \[ 8\] .SUNW_dynsymsort SUNW_symsort 00000000000007d8 0007d8 000018 04 A 5 0 8
+ \[ 9\] .SUNW_dynsymnsort SUNW_symnsort 00000000000007f0 0007f0 000020 04 A 5 0 8
+ \[10\] .SUNW_phname SUNW_phname 0000000000000810 000810 000010 04 A 7 0 4
+ \[11\] .SUNW_reloc RELA 0000000000000820 000820 000018 18 A 6 0 8
+ \[12\] .rela.plt RELA 0000000000000838 000838 000018 18 AI 6 16 8
+ \[13\] .rodata PROGBITS 0000000000000850 000850 000017 00 A 0 0 1
+ \[14\] .plt PROGBITS 0000000000000868 000868 000020 10 AX 0 0 8
+ \[15\] .text PROGBITS 0000000000000888 000888 000045 00 AX 0 0 1
+ \[16\] .got PROGBITS 00000000001008d0 0008d0 000028 08 WA 0 0 8
+ \[17\] .bss NOBITS 00000000001008f8 0008f8 000004 00 WA 0 0 4
+ \[18\] .SUNW_symtabsort SUNW_symsort 0000000000000000 0008f8 000018 04 21 0 8
+ \[19\] .SUNW_symtabnsort SUNW_symnsort 0000000000000000 000910 000028 04 21 0 8
+ \[20\] .comment PROGBITS 0000000000000000 000938 000013 01 0 0 1
+ \[21\] .symtab SYMTAB 0000000000000000 000950 000150 18 22 5 8
+ \[22\] .strtab STRTAB 0000000000000000 000aa0 00007d 00 S 0 0 1
+ \[23\] .shstrtab STRTAB 0000000000000000 000b1d 0000ea 00 S 0 0 1
+Key to Flags:
+ W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\), I \(info\),
+ L \(link order\), O \(extra OS processing required\), G \(group\), T \(TLS\),
+ C \(compressed\), x \(unknown\), o \(OS specific\), E \(exclude\),
+ l \(large\), p \(processor specific\)
+#pass
diff --git a/binutils/testsuite/binutils-all/x86-64/solaris-strip.rd b/binutils/testsuite/binutils-all/x86-64/solaris-strip.rd
new file mode 100644
index 00000000000..f9bbe157fcf
--- /dev/null
+++ b/binutils/testsuite/binutils-all/x86-64/solaris-strip.rd
@@ -0,0 +1,49 @@
+ELF Header:
+ Magic: 7f 45 4c 46 02 01 01 06 01 00 00 00 00 00 00 00
+ Class: ELF64
+ Data: 2's complement, little endian
+ Version: 1 \(current\)
+ OS/ABI: UNIX - Solaris
+ ABI Version: 1
+ Type: DYN \(Shared object file\)
+ Machine: Advanced Micro Devices X86-64
+ Version: 0x1
+ Entry point address: 0x888
+ Start of program headers: 64 \(bytes into file\)
+ Start of section headers: 2504 \(bytes into file\)
+ Flags: 0x0
+ Size of this header: 64 \(bytes\)
+ Size of program headers: 56 \(bytes\)
+ Number of program headers: 4
+ Size of section headers: 64 \(bytes\)
+ Number of section headers: 20
+ Section header string table index: 19
+
+Section Headers:
+ \[Nr\] Name Type Address Off Size ES Flg Lk Inf Al
+ \[ 0\] NULL 0000000000000000 000000 000000 00 0 0 0
+ \[ 1\] .dynamic DYNAMIC 0000000000000120 000120 000240 10 A 7 0 8
+ \[ 2\] .eh_frame_hdr X86_64_UNWIND 0000000000000360 000360 000014 00 A 0 0 8
+ \[ 3\] .eh_frame X86_64_UNWIND 0000000000000378 000378 000038 00 A 0 0 8
+ \[ 4\] .hash HASH 00000000000003b0 0003b0 00005c 04 A 6 0 8
+ \[ 5\] .SUNW_ldynsym SUNW_LDYNSYM 0000000000000410 000410 000048 18 A 7 3 8
+ \[ 6\] .dynsym DYNSYM 0000000000000458 000458 0000f0 18 A 7 1 8
+ \[ 7\] .dynstr STRTAB 0000000000000548 000548 00028c 00 AS 0 0 1
+ \[ 8\] .SUNW_dynsymsort SUNW_symsort 00000000000007d8 0007d8 000018 04 A 5 0 8
+ \[ 9\] .SUNW_dynsymnsort SUNW_symnsort 00000000000007f0 0007f0 000020 04 A 5 0 8
+ \[10\] .SUNW_phname SUNW_phname 0000000000000810 000810 000010 04 A 7 0 4
+ \[11\] .SUNW_reloc RELA 0000000000000820 000820 000018 18 A 6 0 8
+ \[12\] .rela.plt RELA 0000000000000838 000838 000018 18 AI 6 16 8
+ \[13\] .rodata PROGBITS 0000000000000850 000850 000017 00 A 0 0 1
+ \[14\] .plt PROGBITS 0000000000000868 000868 000020 10 AX 0 0 8
+ \[15\] .text PROGBITS 0000000000000888 000888 000045 00 AX 0 0 1
+ \[16\] .got PROGBITS 00000000001008d0 0008d0 000028 08 WA 0 0 8
+ \[17\] .bss NOBITS 00000000001008f8 0008f8 000004 00 WA 0 0 4
+ \[18\] .comment PROGBITS 0000000000000000 0008f8 000013 01 0 0 1
+ \[19\] .shstrtab STRTAB 0000000000000000 00090b 0000b7 00 S 0 0 1
+Key to Flags:
+ W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\), I \(info\),
+ L \(link order\), O \(extra OS processing required\), G \(group\), T \(TLS\),
+ C \(compressed\), x \(unknown\), o \(OS specific\), E \(exclude\),
+ l \(large\), p \(processor specific\)
+#pass
diff --git a/binutils/testsuite/binutils-all/x86-64/solaris.so.bz2 b/binutils/testsuite/binutils-all/x86-64/solaris.so.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..8f80e875342353d04987fa0af25e40b110444fb4
GIT binary patch
literal 1433
zcmV;K1!np}T4*^jL0KkKS<yq-AOHpGfB*mg|Ns7Fe_Q|m-t_<X|8u$SL@<N|bU+It
zz`#OwXim@s+bdOufuPN{Q3*tiCY1I@l>JRMsp@*3kjOL#r~^Y!Pyh`805K0x0j8Qg
zO#?uBnh#I_^#+6qp%Y|G)Si)=fXFmyra)<?fB~ne=>Py4003wJXc`8LKnW2hq<WZ2
zdSpFNVjq<>+L~l~jXg~Un@|m@qeg%aA^;jR15E?ec_4a&O#lP{WND_Dm_{Z>CXF=6
z$iR#VfFnkk7@7tM(8$3Ij7$i?0Wcr~BTY2K!Z9*2G-;+rMg(9?0U9*O#LzHChDHcv
zVqiu934@M~LpWQ$PQ@OiZJSG%(O$ej@L-nS*37q=V`kSPCD=Bant^OWbO?+j2Ldff
z9RpGeU2-X;!z$N26c$g(+fU3GU11vHy?^aOkc?h6A)yUtTfBpm!)w{GXt~*>mydJg
zQa22W%g32ntzSqu!siY<n2jCY4D1;20e2?rFE(fX+0*+{%|@;aK~Wi#PWFfR9D#F=
zfjCmkh=DDR6k(WFvy)ACX*N_aFlJGQJyI1y@~y8XZzIR(qZ@OP!wLo6DDP-`oOnb;
zTbi@(@-ejV06-UlIbY?AX*%iUJz82TP(xiB%3_SO%BO<tX0`L=bOt!Y4g_*If)i%2
z5jl0=aVyr~)zi@A;o<eUSWqFR#nIxdt?iIsSX$)Y*slg`TKu8ITiar~LmFBb5gDQu
zXv-g~-E#5$F8)$L27^fmwWN+V`Vo2I^0fQyUMHE|YT>r{#2t)4aaeHJUN;by^`M3%
z185Mp@d*u}Y;6N*Y(r>Gq=vz;p%9Y1M3M(K=dH}GPG!Sv@32%XzXYW$ZHE#MC7>)%
zgrJ!7Z<&m`l^bAt8P}M>?0s|aF41RQu?@eo2COOD7sOa1gC!%4gE8@WD^U3ioa;-L
zjM_)8ts&;YBb4+SUKN20bXYhVkG6N33#Z%Nm5PB`ZLa05&M2!bU}0#Z*}WM|)X6IF
znHC4oIV%NUXwpHK^}<Nm)ApP}5jUL*Qbm7slE!V(kzx=)#Fqu24Qq*(OD~NXm}^?@
z7-Qu^4pQzdEu|XLX7sSKQF)Tc%Z`C)-IZ=;O4$#7HU477m}^AO0)JX;g>1P!3grr8
zID#0U5s(865yu>Di{lWM`6y5sG-X%y4GhqX+Ua2nXyAQY5iCN;m|M-v2A^NSl-bXu
z2tKAGu;JVl+r$X4d9aBXXSjAZ5OeeYs!;-Cv5m39;7se%CH8YNnuf?|>R`InF_0+f
zp+jt_;9(HsUt33gMQa1i*yguw_my1znZL*9R14z+NvImD*wLF@<!bY=Sxh-3%ZyQ{
z@KRq<a^&eaCC12mhPl`rcO=jSlImPmUMhOb0tt_!<)-2pA<-ZqauWcV5iH$9Ag%pY
z{9f*MFE7ZPU1g*xg(>C97*wz~Fg7Ge3PiHboT>?NkpSEaDQbu=NQ?_<(hEHT$gxKB
zP+<{?Wkw0h&rP9JGc<(-4@BjZMwfzeD2fQS>_fw<dF@)!gjsZ2Ca8w}4Q=9uID5C&
zhecU~`3;F^6=8iFIG$xyfnrvXs4T+@$i+lZVK~)KpHUQ3gI!%>ybg|-h+t8GMsXoX
zMyRp^2b3pCWF{1n0Ow*Xg4#3SNDK(d5U~}jj|Dn&NcHy;I#g{si!gds5Rh^y;V7Iu
z)T26zs5zE^972&ocu}<kBo-ki!7y-+0~l7dE-iwl-9iKeRRJll#H(T+P5S3fC$%sf
z>c|#kYz<PeH^vc|aUqy-tZ`QSytc^h%g`!{F=$8)5fAjs`=$ovAt9N#*JCRMWK%V4
nB`PYD)jqFa|3TEawxS<?gKgVmjXt02fAM!DQ-ui)6g`3fPfm%5
literal 0
HcmV?d00001
diff --git a/binutils/testsuite/binutils-all/x86-64/x86-64.exp b/binutils/testsuite/binutils-all/x86-64/x86-64.exp
index 162030e5aea..d0a4e89fd34 100644
--- a/binutils/testsuite/binutils-all/x86-64/x86-64.exp
+++ b/binutils/testsuite/binutils-all/x86-64/x86-64.exp
@@ -14,7 +14,79 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
-if {![istarget "x86_64-*-linux*"] || [is_remote host]} {
+if {![is_elf_format] || ![istarget "x86_64-*-*"] || [is_remote host]} {
+ return
+}
+
+proc run_solaris_test {tst obj objcopy_dump strip_dump} {
+ global srcdir
+ global subdir
+ global READELF
+ global OBJCOPY
+ global STRIP
+
+ set testname "$tst (objcopy)"
+ set copy tmpdir/copy.so
+ set cmd "$OBJCOPY $obj $copy"
+ send_log "$cmd\n"
+ verbose "$cmd" 1
+ catch "exec $cmd" got
+ if ![string match "" $got] then {
+ fail "$testname"
+ return
+ }
+ set cmd "$READELF -hSW $copy"
+ send_log "$cmd\n"
+ set got [remote_exec host "$cmd" "" "/dev/null" "tmpdir/solaris.out"]
+ if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ fail "$testname (reason: unexpected output)"
+ send_log "$got\n"
+ return
+ }
+ if { [regexp_diff tmpdir/solaris.out $srcdir/$subdir/$objcopy_dump] } then {
+ fail "$testname"
+ return
+ }
+ pass "$testname"
+
+ set testname "$tst (strip)"
+ set stripped tmpdir/stripped.so
+ set cmd "$STRIP $obj -o $stripped"
+ send_log "$cmd\n"
+ verbose "$cmd" 1
+ catch "exec $cmd" got
+ if ![string match "" $got] then {
+ fail "$testname"
+ return
+ }
+ set cmd "$READELF -hSW $stripped"
+ send_log "$cmd\n"
+ set got [remote_exec host "$cmd" "" "/dev/null" "tmpdir/solaris.out"]
+ if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ fail "$testname (reason: unexpected output)"
+ send_log "$got\n"
+ return
+ }
+ if { [regexp_diff tmpdir/solaris.out $srcdir/$subdir/$strip_dump] } then {
+ fail "$testname"
+ return
+ }
+ pass "$testname"
+}
+
+set t $srcdir/$subdir/solaris.so.bz2
+# We need to strip the ".bz2", but can leave the dirname.
+set test $subdir/[file tail $t]
+set testname [file rootname $test]
+verbose $testname
+set obj tmpdir/solaris.so
+if {[catch "system \"bzip2 -dc $t > $obj\""] != 0} {
+ untested "bzip2 -dc ($testname)"
+} else {
+ run_solaris_test $testname $obj solaris-objcopy.rd solaris-strip.rd
+}
+
+if {![istarget "x86_64-*-linux*"]} {
return
}
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index 54c80604f24..c1fc8d1853b 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -104,12 +104,21 @@ if [istarget "*-*-go32*"] {
}
}
+if { [is_elf_format] } {
+ # Tests here need -melf_i386_sol2 support.
+ set status [catch "exec $LD -V -melf_i386_sol2" got]
+ if { $status == 0 } {
+ run_dump_test "solaris-1"
+ }
+}
+
if { !([istarget "i?86-*-elf*"]
|| [istarget "i?86-*-linux*"]
|| [istarget "i?86-*-gnu*"]
|| [istarget "x86_64-*-elf*"]
|| [istarget "x86_64-*-linux*"]
|| [istarget "amd64-*-linux*"]) } {
+ set ASFLAGS "$saved_ASFLAGS"
return
}
diff --git a/ld/testsuite/ld-i386/solaris-1.d b/ld/testsuite/ld-i386/solaris-1.d
new file mode 100644
index 00000000000..881ea7d35e9
--- /dev/null
+++ b/ld/testsuite/ld-i386/solaris-1.d
@@ -0,0 +1,16 @@
+#source: ../ld-x86-64/solaris-1.s
+#as: --32
+#ld: -shared -m elf_i386_sol2 --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
+#readelf: -hSW
+
+#...
+ Version: 1 \(current\)
+ OS/ABI: UNIX - System V
+ ABI Version: 0
+ Type: DYN \(Shared object file\)
+ Machine: Intel 80386
+ Version: 0x1
+#...
+ \[[ 0-9]+\] .strtab STRTAB 0+ [0-9a-f]+ [0-9a-f]+ 00 S 0 0 1
+ \[[ 0-9]+\] .shstrtab STRTAB 0+ [0-9a-f]+ [0-9a-f]+ 00 S 0 0 1
+#...
diff --git a/ld/testsuite/ld-x86-64/solaris-1.d b/ld/testsuite/ld-x86-64/solaris-1.d
new file mode 100644
index 00000000000..7cdc9fd5129
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/solaris-1.d
@@ -0,0 +1,15 @@
+#as: --64
+#ld: -shared -m elf_x86_64_sol2 --hash-style=sysv -z max-page-size=0x200000 -z noseparate-code
+#readelf: -hSW
+
+#...
+ Version: 1 \(current\)
+ OS/ABI: UNIX - System V
+ ABI Version: 0
+ Type: DYN \(Shared object file\)
+ Machine: Advanced Micro Devices X86-64
+ Version: 0x1
+#...
+ \[[ 0-9]+\] .strtab STRTAB 0+ [0-9a-f]+ [0-9a-f]+ 00 S 0 0 1
+ \[[ 0-9]+\] .shstrtab STRTAB 0+ [0-9a-f]+ [0-9a-f]+ 00 S 0 0 1
+#...
diff --git a/ld/testsuite/ld-x86-64/solaris-1.s b/ld/testsuite/ld-x86-64/solaris-1.s
new file mode 100644
index 00000000000..e28a3769c08
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/solaris-1.s
@@ -0,0 +1,7 @@
+ .data
+ .globl foo
+ .type foo, @object
+foo:
+ .dc.a 0
+ .size foo, .-foo
+ .section .note.GNU-stack,"",@progbits
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 5608c42a0db..5a1b63090d2 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -22,7 +22,7 @@
# Test x86_64 linking; all types of relocs. This tests the assembler and
# tools like objdump as well as the linker.
-if { !([istarget "x86_64-*-elf*"] || [istarget "x86_64-*-linux*"]) } {
+if { ![istarget "x86_64-*-*"] } {
return
}
@@ -30,6 +30,19 @@ set emul "elf_x86_64"
set saved_ASFLAGS "$ASFLAGS"
set ASFLAGS "$ASFLAGS -mx86-used-note=no"
+if {[is_elf_format] } {
+ # Tests here need -melf_x86_64_sol2 support.
+ set status [catch "exec $LD -V -melf_x86_64_sol2" got]
+ if { $status == 0 } {
+ run_dump_test "solaris-1"
+ }
+}
+
+if { !([istarget "x86_64-*-elf*"] || [istarget "x86_64-*-linux*"]) } {
+ set ASFLAGS "$saved_ASFLAGS"
+ return
+}
+
# List contains test-items with 3 items followed by 2 lists:
# 0:name 1:ld early options 2:ld late options 3:assembler options
# 4:filenames of assembler files 5: action and options. 6: name of output file
--
Alan Modra
More information about the Binutils
mailing list