Skip to content
Commit 2159c3f1 authored by H.J. Lu's avatar H.J. Lu
Browse files

Properly handle relocs against absolute symbols

Relocations against absolute symbols in shared object should be resolved
at link-time if symbols are bounded locally.  For PC-relative relocation
against absolute symbols, they should be converted to non-PC-relative
relocation in target backend.  If conversion can't be performed, target
backend should detect it and issue an error.  This patch only fixes x86
backends.

bfd/

	PR ld/19818
	* bfd-in.h (bfd_elf_record_link_assignment): Add a bfd_boolean.
	* bfd-in2.h: Regenerated.
	* elf-bfd.h (elf_link_hash_entry): Add def_linker and
	def_linker_abs.
	(RESOLVED_TO_ABS_IN_PIC): New macro.
	* elf32-i386.c (RESOLVED_TO_ZERO_OR_ABS): New macro.
	(elf_i386_allocate_dynrelocs): Replace
	UNDEFINED_WEAK_RESOLVED_TO_ZERO with RESOLVED_TO_ZERO_OR_ABS.
	Discard space for non-pc-relative relocs against symbols which
	are always resolved at link-time.
	(elf_i386_convert_load): Replace UNDEFINED_WEAK_RESOLVED_TO_ZERO
	with RESOLVED_TO_ZERO_OR_ABS.
	(elf_i386_relocate_section): Replace
	UNDEFINED_WEAK_RESOLVED_TO_ZERO with RESOLVED_TO_ZERO_OR_ABS.
	Properly handle R_386_32 relocation against absolute symbol.
	* elf64-x86-64.c (RESOLVED_TO_ZERO_OR_ABS): New macro.
	(elf_x86_64_need_pic): Updated to check absolute symbol.
	(elf_x86_64_check_relocs): Don't check R_X86_64_32 nor
	R_X86_64_32S in shared object here.  Use elf_x86_64_need_pic.
	(elf_x86_64_allocate_dynrelocs): Replace
	UNDEFINED_WEAK_RESOLVED_TO_ZERO with RESOLVED_TO_ZERO_OR_ABS.
	Discard space for non-pc-relative relocs against symbols which
	are always resolved at link-time.
	(elf_x86_64_convert_load): Replace UNDEFINED_WEAK_RESOLVED_TO_ZERO
	with RESOLVED_TO_ZERO_OR_ABS.  Check def_linker for linker
	defined symbol.
	(elf_x86_64_relocate_section): Replace
	UNDEFINED_WEAK_RESOLVED_TO_ZERO with RESOLVED_TO_ZERO_OR_ABS.
	Properly handle R_X86_64_PC32, R_X86_64_32, R_X86_64_32S amd
	R_X86_64_64 relocations against absolute symbol.
	* elflink.c (bfd_elf_record_link_assignment): Updated.  Set
	def_linker and defsym.

ld/

	PR ld/19818
	* emultempl/elf32.em (gld${EMULATION_NAME}_find_exp_assignment):
	Pass "exp->assign.defsym || !expld.rel_from_abs" to
	bfd_elf_record_link_assignment.
	(gld${EMULATION_NAME}_before_allocation): Set def_linker for
	"__ehdr_start".
	* testsuite/ld-i386/i386.exp: Run PR ld/19818 tests.
	* testsuite/ld-x86-64/x86-64.exp: Likewise.
	* testsuite/ld-elf/pr19818a.d: New file.
	* testsuite/ld-elf/pr19818a.s: Likewise.
	* testsuite/ld-elf/pr19818b.d: Likewise.
	* testsuite/ld-elf/pr19818b.s: Likewise.
	* testsuite/ld-i386/pr19818-1.t: Likewise.
	* testsuite/ld-i386/pr19818-1a.d: Likewise.
	* testsuite/ld-i386/pr19818-1a.s: Likewise.
	* testsuite/ld-i386/pr19818-1b.d: Likewise.
	* testsuite/ld-i386/pr19818-1b.s: Likewise.
	* testsuite/ld-i386/pr19818-1c.d: Likewise.
	* testsuite/ld-i386/pr19818-1c.s: Likewise.
	* testsuite/ld-i386/pr19818-1d.d: Likewise.
	* testsuite/ld-i386/pr19818-1e.d: Likewise.
	* testsuite/ld-i386/pr19818-1f.d: Likewise.
	* testsuite/ld-i386/pr19818-1g.d: Likewise.
	* testsuite/ld-i386/pr19818-1h.d: Likewise.
	* testsuite/ld-i386/pr19818-1i.d: Likewise.
	* testsuite/ld-i386/pr19818-1j.d: Likewise.
	* testsuite/ld-i386/pr19818-1k.d: Likewise.
	* testsuite/ld-i386/pr19818-1l.d: Likewise.
	* testsuite/ld-i386/pr19818-2.s: Likewise.
	* testsuite/ld-i386/pr19818-2a.d: Likewise.
	* testsuite/ld-i386/pr19818-2b.d: Likewise.
	* testsuite/ld-i386/pr19818-2c.d: Likewise.
	* testsuite/ld-i386/pr19818-2d.d: Likewise.
	* testsuite/ld-i386/pr19818-2e.d: Likewise.
	* testsuite/ld-i386/pr19818-2f.d: Likewise.
	* testsuite/ld-i386/pr19818-2g.d: Likewise.
	* testsuite/ld-i386/pr19818-2h.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1.t: Likewise.
	* testsuite/ld-x86-64/pr19818-1a.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1a.s: Likewise.
	* testsuite/ld-x86-64/pr19818-1b.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1b.s: Likewise.
	* testsuite/ld-x86-64/pr19818-1c.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1c.s: Likewise.
	* testsuite/ld-x86-64/pr19818-1d.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1e.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1f.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1g.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1h.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1i.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1j.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1k.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1l.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1m.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1n.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1o.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1p.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1q.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1r.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1s.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1t.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1u.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1v.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1w.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1x.d: Likewise.
	* testsuite/ld-x86-64/pr19818-1y.d: Likewise.
	* testsuite/ld-x86-64/pr19818-2.s: Likewise.
	* testsuite/ld-x86-64/pr19818-2a.d: Likewise.
	* testsuite/ld-x86-64/pr19818-2b.d: Likewise.
	* testsuite/ld-x86-64/pr19818-2c.d: Likewise.
	* testsuite/ld-x86-64/pr19818-2d.d: Likewise.
	* testsuite/ld-x86-64/pr19818-3.s: Likewise.
	* testsuite/ld-x86-64/pr19818-3a.d: Likewise.
	* testsuite/ld-x86-64/pr19818-3b.d: Likewise.
	* testsuite/ld-x86-64/pr19818-3c.d: Likewise.
	* testsuite/ld-x86-64/pr19818-3d.d: Likewise.
	* testsuite/ld-x86-64/pr19818-4.s: Likewise.
	* testsuite/ld-x86-64/pr19818-4a.d: Likewise.
	* testsuite/ld-x86-64/pr19818-4b.d: Likewise.
	* testsuite/ld-x86-64/pr19818-5.s: Likewise.
	* testsuite/ld-x86-64/pr19818-5a.d: Likewise.
	* testsuite/ld-x86-64/pr19818-5b.d: Likewise.
parent d834e635
Loading
Loading
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment