When bfd/pdp11.c was copied from bfd/aoutx.h, the #defines for external symbol types N_TEXT etc. were #undef'd and then #define'd with new values. But N_STAB was not changed even though the new value for N_EXT overlapped with it. This caused aout_link_write_symbols() to treat global symbols referenced in the source but defined in a linker script as undefined.
Separately, in translate_symbol_table() the 16-bit symbol values were sign extended to unsigned long (e.g., 64 bits) when they really should be treated as unsigned so the value remains 16 bits. PR 25828 * pdp11.c (N_STAB): Modify value to avoid conflict with N_EXT causing globals from linker script to be treated as debug symbols. (translate_symbol_table): Don't sign-extend symbol values from 16 to 64 bits in nm output.
This commit is contained in:
parent
c2e5c986b3
commit
23c8270e9d
|
@ -1,3 +1,10 @@
|
|||
2020-04-20 Stephen Casner <casner@acm.org>
|
||||
|
||||
* pdp11.c (N_STAB): Modify value to avoid conflict with N_EXT
|
||||
causing globals from linker script to be treated as debug symbols.
|
||||
(translate_symbol_table): Don't sign-extend symbol values from 16
|
||||
to 64 bits in nm output.
|
||||
|
||||
2020-04-20 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* elf64-ppc.c (ppc64_elf_size_stubs): Strip relbrlt too.
|
||||
|
|
|
@ -160,6 +160,7 @@ static bfd_boolean MY(write_object_contents) (bfd *);
|
|||
#undef N_REG
|
||||
#undef N_FN
|
||||
#undef N_EXT
|
||||
#undef N_STAB
|
||||
#define N_TYPE 0x1f /* Type mask. */
|
||||
#define N_UNDF 0x00 /* Undefined. */
|
||||
#define N_ABS 0x01 /* Absolute. */
|
||||
|
@ -169,6 +170,7 @@ static bfd_boolean MY(write_object_contents) (bfd *);
|
|||
#define N_REG 0x14 /* Register symbol. */
|
||||
#define N_FN 0x1f /* File name. */
|
||||
#define N_EXT 0x20 /* External flag. */
|
||||
#define N_STAB 0xc0 /* Not relevant; modified aout64.h's 0xe0 to avoid N_EXT. */
|
||||
|
||||
#define RELOC_SIZE 2
|
||||
|
||||
|
@ -1501,7 +1503,7 @@ NAME (aout, translate_symbol_table) (bfd *abfd,
|
|||
else
|
||||
return FALSE;
|
||||
|
||||
in->symbol.value = GET_SWORD (abfd, ext->e_value);
|
||||
in->symbol.value = GET_WORD (abfd, ext->e_value);
|
||||
/* TODO: is 0 a safe value here? */
|
||||
in->desc = 0;
|
||||
in->other = 0;
|
||||
|
|
Loading…
Reference in New Issue