Commit 9f11c00c authored by Roland McGrath's avatar Roland McGrath

Fix references to __ehdr_start when it cannot be defined

ld/
	* emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation):
	Don't use bfd_elf_record_link_assignment to mark __ehdr_start
	hidden.  Instead, just do it directly here, and only if it was
	referenced but not defined.

ld/testsuite/
	* ld-elf/ehdr_start-userdef.t: New file.
	* ld-elf/ehdr_start-userdef.d: New file.
	* ld-elf/ehdr_start-strongref.s: New file.
	* ld-elf/ehdr_start-missing.t: New file.
	* ld-elf/ehdr_start-missing.d: New file.
	* ld-elf/ehdr_start-weak.d: New file.
	* ld-mips-elf/ehdr_start-2.nd: Expect __ehdr_start to be global.

(cherry picked from commit c2763e270c6627e55ac7a75ed3c0a717fbca9bd0)
parent fc063e1f
2013-11-19 Roland McGrath <mcgrathr@google.com>
Alan Modra <amodra@gmail.com>
* emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation):
Don't use bfd_elf_record_link_assignment to mark __ehdr_start
hidden. Instead, just do it directly here, and only if it was
referenced but not defined.
2013-11-18 Chung-Lin Tang <cltang@codesourcery.com> 2013-11-18 Chung-Lin Tang <cltang@codesourcery.com>
Backport from master Backport from master
......
...@@ -1487,10 +1487,25 @@ gld${EMULATION_NAME}_before_allocation (void) ...@@ -1487,10 +1487,25 @@ gld${EMULATION_NAME}_before_allocation (void)
/* Make __ehdr_start hidden if it has been referenced, to /* Make __ehdr_start hidden if it has been referenced, to
prevent the symbol from being dynamic. */ prevent the symbol from being dynamic. */
if (!bfd_elf_record_link_assignment (link_info.output_bfd, &link_info, if (!link_info.relocatable)
"__ehdr_start", TRUE, TRUE)) {
einfo ("%P%F: failed to record assignment to %s: %E\n", struct elf_link_hash_entry *h
"__ehdr_start"); = elf_link_hash_lookup (elf_hash_table (&link_info), "__ehdr_start",
FALSE, FALSE, TRUE);
/* Only adjust the export class if the symbol was referenced
and not defined, otherwise leave it alone. */
if (h != NULL
&& (h->root.type == bfd_link_hash_new
|| h->root.type == bfd_link_hash_undefined
|| h->root.type == bfd_link_hash_undefweak
|| h->root.type == bfd_link_hash_common))
{
_bfd_elf_link_hash_hide_symbol (&link_info, h, TRUE);
if (ELF_ST_VISIBILITY (h->other) != STV_INTERNAL)
h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
}
}
/* If we are going to make any variable assignments, we need to /* If we are going to make any variable assignments, we need to
let the ELF backend know about them in case the variables are let the ELF backend know about them in case the variables are
......
2013-11-19 Roland McGrath <mcgrathr@google.com>
* ld-elf/ehdr_start-userdef.t: New file.
* ld-elf/ehdr_start-userdef.d: New file.
* ld-elf/ehdr_start-strongref.s: New file.
* ld-elf/ehdr_start-missing.t: New file.
* ld-elf/ehdr_start-missing.d: New file.
* ld-elf/ehdr_start-weak.d: New file.
* ld-mips-elf/ehdr_start-2.nd: Expect __ehdr_start to be global.
2013-11-17 H.J. Lu <hongjiu.lu@intel.com> 2013-11-17 H.J. Lu <hongjiu.lu@intel.com>
* ld-x86-64/mpx.exp: New file. * ld-x86-64/mpx.exp: New file.
......
#source: ehdr_start-strongref.s
#ld: -e _start -T ehdr_start-missing.t
#error: .*: undefined reference to `__ehdr_start'
#target: *-*-linux* *-*-gnu* *-*-nacl*
SECTIONS
{
. = 0x10000000;
.text : { *(.text) }
. = 0x20000000;
.rodata : { *(.rodata) }
}
.text
.globl _start
_start:
.space 16
.section .rodata,"a"
.globl foo
foo:
.dc.a __ehdr_start
#source: ehdr_start-strongref.s
#ld: -e _start -T ehdr_start-userdef.t
#readelf: -Ws
#target: *-*-linux* *-*-gnu* *-*-nacl*
Symbol table '\.symtab' contains [0-9]+ entries:
#...
*[0-9]+: 0*12345678 +0 +NOTYPE +GLOBAL +DEFAULT +ABS +__ehdr_start
#pass
SECTIONS
{
. = 0x10000000;
.text : { *(.text) }
__ehdr_start = 0x12345678;
. = 0x20000000;
.rodata : { *(.rodata) }
}
#source: ehdr_start.s
#ld: -e _start -T ehdr_start-missing.t
#nm: -n
#target: *-*-linux* *-*-gnu* *-*-nacl*
#...
\s+[wU] __ehdr_start
#pass
Symbol table '\.symtab' contains [0-9]+ entries: Symbol table '\.symtab' contains [0-9]+ entries:
#... #...
*[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ __ehdr_start *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +GLOBAL +DEFAULT +[0-9]+ __ehdr_start
#pass #pass
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment