mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-27 22:48:57 +08:00
PR22471, undefined reference to linker-defined symbols
This patch processes linker script assignment statements before ld opens DT_NEEDED libraries, in order to define symbols like __bss_start that might also be defined by a library, falsely triggering an error about "DSO missing from command line". The initial value won't be correct when assigning a symbol from dot, and I make no attempt to handle all expressions. For example, an assignment like "_start_foo = ADDR (.foo)" isn't valid until sections are laid out, so won't define _start_foo early. What's here should be enough for most common scripts, and hopefully won't perturb fragile scripts. bfd/ PR 22471 * elflink.c (_bfd_elf_merge_symbol): Allow weak symbols to override early passes over linker script symbols. * linker.c (_bfd_generic_link_add_one_symbol): Allow symbols to override early passes over linker script symbols. Clear ldscript_def on symbol definitions. ld/ PR 22471 * ldexp.c (struct definedness_hash_entry): Delete "by_script". Make "iteration" an 8-bit field, and update mask in all uses. (definedness_newfunc): Don't init "by_script". (update_definedness): Test ldscript_def rather than by_script. (is_sym_value): Likewise. (fold_name <DEFINED>): Return a result for first phase. Test ldscript_def. (fold_name <NAME>): Return a result for first phase. * ldlang.c (open_input_bfds): Process all assignments, not just defsym. (lang_process): Increment lang_statement_iteration before open_input_bfds. * testsuite/ld-mips-elf/tlsdyn-o32-1.d: Adjust for larger .dynsym. * testsuite/ld-mips-elf/tlsdyn-o32-1.got: Likewise. * testsuite/ld-mips-elf/tlsdyn-o32-2.d: Likewise. * testsuite/ld-mips-elf/tlsdyn-o32-2.got: Likewise. * testsuite/ld-mips-elf/tlsdyn-o32-3.d: Likewise. * testsuite/ld-mips-elf/tlsdyn-o32-3.got: Likewise.
This commit is contained in:
@ -1443,9 +1443,14 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
|
||||
do
|
||||
{
|
||||
enum link_action action;
|
||||
int prev;
|
||||
|
||||
prev = h->type;
|
||||
/* Treat symbols defined by early linker script pass as undefined. */
|
||||
if (h->ldscript_def)
|
||||
prev = bfd_link_hash_undefined;
|
||||
cycle = FALSE;
|
||||
action = link_action[(int) row][(int) h->type];
|
||||
action = link_action[(int) row][prev];
|
||||
switch (action)
|
||||
{
|
||||
case FAIL:
|
||||
@ -1489,6 +1494,7 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
|
||||
h->u.def.section = section;
|
||||
h->u.def.value = value;
|
||||
h->linker_def = 0;
|
||||
h->ldscript_def = 0;
|
||||
|
||||
/* If we have been asked to, we act like collect2 and
|
||||
identify all functions that might be global
|
||||
@ -1588,6 +1594,7 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
|
||||
else
|
||||
h->u.c.p->section = section;
|
||||
h->linker_def = 0;
|
||||
h->ldscript_def = 0;
|
||||
break;
|
||||
|
||||
case REF:
|
||||
|
Reference in New Issue
Block a user