PR ld/20125, MMIX weak symbols
Weak undefineds with PUSHJ relocs were "lost", causing internal inconsistencies and an abort.
This commit is contained in:
parent
454c9bb956
commit
284d826d9f
@ -1,3 +1,9 @@
|
|||||||
|
2017-08-21 Hans-Peter Nilsson <hp@bitrange.com>
|
||||||
|
|
||||||
|
PR ld/20125
|
||||||
|
* elf64-mmix.c (mmix_elf_relax_section): Correct handling of
|
||||||
|
undefined weak symbols.
|
||||||
|
|
||||||
2017-08-18 Nick Clifton <nickc@redhat.com>
|
2017-08-18 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
PR binutils/21962
|
PR binutils/21962
|
||||||
|
@ -2710,8 +2710,21 @@ mmix_elf_relax_section (bfd *abfd,
|
|||||||
indx = ELF64_R_SYM (irel->r_info) - symtab_hdr->sh_info;
|
indx = ELF64_R_SYM (irel->r_info) - symtab_hdr->sh_info;
|
||||||
h = elf_sym_hashes (abfd)[indx];
|
h = elf_sym_hashes (abfd)[indx];
|
||||||
BFD_ASSERT (h != NULL);
|
BFD_ASSERT (h != NULL);
|
||||||
if (h->root.type != bfd_link_hash_defined
|
if (h->root.type == bfd_link_hash_undefweak)
|
||||||
&& h->root.type != bfd_link_hash_defweak)
|
/* FIXME: for R_MMIX_PUSHJ_STUBBABLE, there are alternatives to
|
||||||
|
the canonical value 0 for an unresolved weak symbol to
|
||||||
|
consider: as the debug-friendly approach, resolve to "abort"
|
||||||
|
(or a port-specific function), or as the space-friendly
|
||||||
|
approach resolve to the next instruction (like some other
|
||||||
|
ports, notably ARM and AArch64). These alternatives require
|
||||||
|
matching code in mmix_elf_perform_relocation or its caller. */
|
||||||
|
symval = 0;
|
||||||
|
else if (h->root.type == bfd_link_hash_defined
|
||||||
|
|| h->root.type == bfd_link_hash_defweak)
|
||||||
|
symval = (h->root.u.def.value
|
||||||
|
+ h->root.u.def.section->output_section->vma
|
||||||
|
+ h->root.u.def.section->output_offset);
|
||||||
|
else
|
||||||
{
|
{
|
||||||
/* This appears to be a reference to an undefined symbol. Just
|
/* This appears to be a reference to an undefined symbol. Just
|
||||||
ignore it--it will be caught by the regular reloc processing.
|
ignore it--it will be caught by the regular reloc processing.
|
||||||
@ -2725,10 +2738,6 @@ mmix_elf_relax_section (bfd *abfd,
|
|||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
symval = (h->root.u.def.value
|
|
||||||
+ h->root.u.def.section->output_section->vma
|
|
||||||
+ h->root.u.def.section->output_offset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ELF64_R_TYPE (irel->r_info) == (int) R_MMIX_PUSHJ_STUBBABLE)
|
if (ELF64_R_TYPE (irel->r_info) == (int) R_MMIX_PUSHJ_STUBBABLE)
|
||||||
@ -2866,6 +2875,8 @@ mmix_elf_relax_section (bfd *abfd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BFD_ASSERT(pjsno == mmix_elf_section_data (sec)->pjs.n_pushj_relocs);
|
||||||
|
|
||||||
if (internal_relocs != NULL
|
if (internal_relocs != NULL
|
||||||
&& elf_section_data (sec)->relocs != internal_relocs)
|
&& elf_section_data (sec)->relocs != internal_relocs)
|
||||||
free (internal_relocs);
|
free (internal_relocs);
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
2017-08-21 Hans-Peter Nilsson <hp@bitrange.com>
|
||||||
|
|
||||||
|
PR ld/20125
|
||||||
|
* testsuite/ld-mmix/pr20125.d, testsuite/ld-mmix/pr20125.s: New
|
||||||
|
test.
|
||||||
|
|
||||||
2017-08-20 A. Wilcox <awilfox@adelielinux.org>
|
2017-08-20 A. Wilcox <awilfox@adelielinux.org>
|
||||||
|
|
||||||
PR ld/21976
|
PR ld/21976
|
||||||
|
21
ld/testsuite/ld-mmix/pr20125.d
Normal file
21
ld/testsuite/ld-mmix/pr20125.d
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#as: -no-predefined-syms -x -I$srcdir/$subdir
|
||||||
|
#ld: -m mmo --defsym __.MMIX.start..text=0x80000
|
||||||
|
#objdump: -dr
|
||||||
|
|
||||||
|
# PUSHJ reloc handling was wrong for weak undefined symbols, causing
|
||||||
|
# internal inconsistencies, leading to a call to abort.
|
||||||
|
# Note that we don't keep track of which symbols have pushj-stubs, so
|
||||||
|
# we get one stub each for the two calls to "foo".
|
||||||
|
|
||||||
|
.*: file format mmo
|
||||||
|
|
||||||
|
Disassembly of section \.text:
|
||||||
|
|
||||||
|
0+80000 <(_start|Main)>:
|
||||||
|
80000: fe000004 get \$0,rJ
|
||||||
|
80004: f2010004 pushj \$1,80014 <Main\+0x14>
|
||||||
|
80008: f2010004 pushj \$1,80018 <Main\+0x18>
|
||||||
|
8000c: f6040000 put rJ,\$0
|
||||||
|
80010: f8010000 pop 1,0
|
||||||
|
80014: f1fdfffb jmp 0 <Main-0x80000>
|
||||||
|
80018: f1fdfffa jmp 0 <Main-0x80000>
|
2
ld/testsuite/ld-mmix/pr20125.s
Normal file
2
ld/testsuite/ld-mmix/pr20125.s
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
.weak bar
|
||||||
|
.include "pr12815-2.s"
|
Loading…
x
Reference in New Issue
Block a user