From: Maciej W. Rozycki Date: Fri, 3 May 2013 15:19:27 +0000 (+0000) Subject: gold/ X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cde7cb0129a884a060b99c7c83e8f5c9af728b0a;p=binutils-gdb.git gold/ PR ld/15365 * layout.cc (Layout::finalize): Make __ehdr_start STV_HIDDEN. ld/ PR ld/15365 * emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation): Restrict __ehdr_start's export class to no less than STV_HIDDEN. ld/testsuite/ PR ld/15365 * ld-elf/ehdr_start.d: Expect __ehdr_start to be STB_LOCAL. * ld-mips-elf/ehdr_start-1.nd: New test. * ld-mips-elf/ehdr_start-2.nd: New test. * ld-mips-elf/ehdr_start-1.ld: New test linker script. * ld-mips-elf/ehdr_start-2.ld: New test linker script. * ld-mips-elf/ehdr_start-new.s: New test source. * ld-mips-elf/ehdr_start-o32.s: New test source. * ld-mips-elf/mips-elf.exp: Run the new tests. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 35aa64abd16..9a50ae01a2d 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,8 @@ +2013-05-03 Maciej W. Rozycki + + PR ld/15365 + * layout.cc (Layout::finalize): Make __ehdr_start STV_HIDDEN. + 2013-05-03 Alan Modra * merge.cc (Output_merge_string::do_add_input_section): Correct diff --git a/gold/layout.cc b/gold/layout.cc index b593acdb0b2..85b1db7a7f1 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -2713,7 +2713,7 @@ Layout::finalize(const Input_objects* input_objects, Symbol_table* symtab, symtab->define_in_output_segment("__ehdr_start", NULL, Symbol_table::PREDEFINED, load_seg, 0, 0, elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL, - elfcpp::STV_DEFAULT, 0, + elfcpp::STV_HIDDEN, 0, Symbol::SEGMENT_START, true); // Set the file offsets of all the non-data sections we've seen so diff --git a/ld/ChangeLog b/ld/ChangeLog index 7175c983439..e41c4dd1437 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2013-05-03 Alan Modra + + PR ld/15365 + * emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation): + Restrict __ehdr_start's export class to no less than STV_HIDDEN. + 2013-05-03 Alan Modra * emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation): diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 251c5110823..581d9db8977 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -1487,6 +1487,13 @@ gld${EMULATION_NAME}_before_allocation (void) { _bfd_elf_tls_setup (link_info.output_bfd, &link_info); + /* Make __ehdr_start hidden if it has been referenced, to + prevent the symbol from being dynamic. */ + if (!bfd_elf_record_link_assignment (link_info.output_bfd, &link_info, + "__ehdr_start", TRUE, TRUE)) + einfo ("%P%F: failed to record assignment to %s: %E\n", + "__ehdr_start"); + /* If we are going to make any variable assignments, we need to let the ELF backend know about them in case the variables are referred to by dynamic objects. */ diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 4b8645b7120..a6919e39f8b 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2013-05-03 Maciej W. Rozycki + + PR ld/15365 + * ld-elf/ehdr_start.d: Expect __ehdr_start to be STB_LOCAL. + * ld-mips-elf/ehdr_start-1.nd: New test. + * ld-mips-elf/ehdr_start-2.nd: New test. + * ld-mips-elf/ehdr_start-1.ld: New test linker script. + * ld-mips-elf/ehdr_start-2.ld: New test linker script. + * ld-mips-elf/ehdr_start-new.s: New test source. + * ld-mips-elf/ehdr_start-o32.s: New test source. + * ld-mips-elf/mips-elf.exp: Run the new tests. + 2013-05-03 Maciej W. Rozycki * ld-elf/provide-hidden-s.nd: New test. diff --git a/ld/testsuite/ld-elf/ehdr_start.d b/ld/testsuite/ld-elf/ehdr_start.d index 9a8288242fa..52e5b548830 100644 --- a/ld/testsuite/ld-elf/ehdr_start.d +++ b/ld/testsuite/ld-elf/ehdr_start.d @@ -4,5 +4,5 @@ #target: *-*-linux* *-*-gnu* *-*-nacl* #... -[0-9a-f]*000 [ADRT] __ehdr_start +[0-9a-f]*000 [Adrt] __ehdr_start #pass diff --git a/ld/testsuite/ld-mips-elf/ehdr_start-1.ld b/ld/testsuite/ld-mips-elf/ehdr_start-1.ld new file mode 100644 index 00000000000..0485b057f36 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/ehdr_start-1.ld @@ -0,0 +1,9 @@ +ENTRY (__start) +SECTIONS +{ + . = 0x12300000 + SIZEOF_HEADERS; + .text : { *(.text) } + . = 0x23400000; + HIDDEN (_gp = ALIGN (16) + 0x7ff0); + .got : { *(.got) } +} diff --git a/ld/testsuite/ld-mips-elf/ehdr_start-1.nd b/ld/testsuite/ld-mips-elf/ehdr_start-1.nd new file mode 100644 index 00000000000..9496b7d002a --- /dev/null +++ b/ld/testsuite/ld-mips-elf/ehdr_start-1.nd @@ -0,0 +1,4 @@ +Symbol table '\.symtab' contains [0-9]+ entries: +#... + *[0-9]+: 0*12300000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ __ehdr_start +#pass diff --git a/ld/testsuite/ld-mips-elf/ehdr_start-2.ld b/ld/testsuite/ld-mips-elf/ehdr_start-2.ld new file mode 100644 index 00000000000..5d5e183c116 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/ehdr_start-2.ld @@ -0,0 +1,10 @@ +ENTRY (__start) +SECTIONS +{ + . = 0x12300000 + SIZEOF_HEADERS; + .text : { *(.text) } + . = 0x23400000; + __ehdr_start = .; + HIDDEN (_gp = ALIGN (16) + 0x7ff0); + .got : { *(.got) } +} diff --git a/ld/testsuite/ld-mips-elf/ehdr_start-2.nd b/ld/testsuite/ld-mips-elf/ehdr_start-2.nd new file mode 100644 index 00000000000..986c2a26cf5 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/ehdr_start-2.nd @@ -0,0 +1,4 @@ +Symbol table '\.symtab' contains [0-9]+ entries: +#... + *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ __ehdr_start +#pass diff --git a/ld/testsuite/ld-mips-elf/ehdr_start-new.s b/ld/testsuite/ld-mips-elf/ehdr_start-new.s new file mode 100644 index 00000000000..5ee00dc4add --- /dev/null +++ b/ld/testsuite/ld-mips-elf/ehdr_start-new.s @@ -0,0 +1,13 @@ + .abicalls + .text + .weak __ehdr_start + .globl __start + .ent __start + .frame $29, 0, $31 + .mask 0x00000000, 0 +__start: + .cplocal $2 + .cpsetup $t9, $zero, __start + lw $2, __ehdr_start + jr $31 + .end __start diff --git a/ld/testsuite/ld-mips-elf/ehdr_start-o32.s b/ld/testsuite/ld-mips-elf/ehdr_start-o32.s new file mode 100644 index 00000000000..09734473fa3 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/ehdr_start-o32.s @@ -0,0 +1,14 @@ + .abicalls + .text + .weak __ehdr_start + .globl __start + .ent __start + .frame $29, 0, $31 + .mask 0x00000000, 0 +__start: + .set noreorder + .cpload $25 + .set reorder + lw $2, __ehdr_start + jr $31 + .end __start diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp index 902ae006a72..97e0c2ce63c 100644 --- a/ld/testsuite/ld-mips-elf/mips-elf.exp +++ b/ld/testsuite/ld-mips-elf/mips-elf.exp @@ -709,3 +709,28 @@ foreach { abi } $abis { "readelf -A export-class-call16-${abi}.gd"] \ "export-class-call16-${abi}.so"]] } + +# Magic __ehdr_start symbol tests. +set abis [concat o32 [expr {$has_newabi ? "n32 n64" : ""}]] +foreach { abi } $abis { + set suff [string map {o32 o32 n32 new n64 new} $abi] + run_ld_link_tests [list \ + [list \ + "MIPS magic __ehdr_start symbol test 1 ($abi)" \ + "$abi_ldflags($abi) -T ehdr_start-1.ld" "" \ + "$abi_asflags($abi)" \ + [list ehdr_start-${suff}.s] \ + [list "readelf -s ehdr_start-1.nd"] \ + "ehdr_start-1-${abi}"]] + if [regexp "(?:n32|n64)" "$abi"] { + setup_kfail "mips*-*-*" "ld/15428" + } + run_ld_link_tests [list \ + [list \ + "MIPS magic __ehdr_start symbol test 2 ($abi)" \ + "$abi_ldflags($abi) -T ehdr_start-2.ld" "" \ + "$abi_asflags($abi)" \ + [list ehdr_start-${suff}.s] \ + [list "readelf -s ehdr_start-2.nd"] \ + "ehdr_start-2-${abi}"]] +}