binutils-gdb/ld/testsuite/ld-cris/gotplt1.d
Alan Modra e310298cf3 PR25593, --as-needed breaks DT_NEEDED order with linker plugin
This patch delays setting up DT_NEEDED dynamic tags until all object
files and libraries have been opened and their symbols processed,
rather than adding the tags while processing symbols.  Tags are
ordered according to the position of the associated library on the
command line and linker scripts.  It is still possible with
--as-needed libs that are mentioned more than once for tags to be
ordered according to which mention was needed.  For example with
"--as-needed a.so b.so c.so b.so" when b.so is not needed by a.so or
any other prior object file but is needed by c.so, the order of tags
will be "A C B".

bfd/
	PR 25593
	* elf-bfd.h (struct elf_link_hash_table): Rename "loaded" to
	"dyn_loaded".
	(bfd_elf_add_dt_needed_tag): Declare.
	* elf-strtab.c (_bfd_elf_strtab_restore): Handle NULL buf.
	* elflink.c (bfd_elf_add_dt_needed_tag): Make global and rename
	from elf_add_dt_needed_tag.  Remove soname and doit param.
	(elf_link_add_object_symbols): Don't use elf_add_dt_needed_tag
	to see whether as-needed lib is already loaded, use dyn_loaded
	list instead.  When saving and restoring around as-needed lib
	handle possibility that dynstr has not been initialised.  Don't
	add DT_NEEDED tags here.  Limit dyn_loaded list to dynamic libs.
	Mark libs loaded via DT_NEEDED entries of other libs with
	DYN_NO_NEEDED if they should not be mentioned in DT_NEEDED of
	the output.
	(elf_link_check_versioned_symbol): Remove now unneccesary
	DYNAMIC check when traversing dyn_loaded list.
ld/
	PR 25593
	* ldelf.c (ldelf_try_needed): Add DT_NEEDED lib to input_bfds.
	(ldelf_after_open): Save state of input_bfds list before loading
	DT_NEEDED libs.  Traverse input_bfds list adding DT_NEEDED tags.
	Restore input_bfds list.
	* testsuite/ld-cris/gotplt1.d: Adjust for changed .dynstr order.
2020-02-26 10:37:25 +10:30

49 lines
1.8 KiB
Makefile

#source: dso-2.s
#source: dsofnf2.s
#source: gotrel1.s
#as: --pic --no-underscore --em=criself
#ld: -m crislinux tmpdir/libdso-1.so --hash-style=sysv
#objdump: -sR
# Make sure we don't merge a PLT-specific entry
# (R_CRIS_JUMP_SLOT) with a non-PLT-GOT-specific entry
# (R_CRIS_GLOB_DAT) in an executable, since they may have
# different contents there. (If we merge them in a DSO it's ok:
# we make a round-trip to the PLT in the executable if it's
# referenced there, but that's still perceived as better than
# having an unnecessary PLT, dynamic reloc and lookup in the
# DSO.) In the executable, the GOT contents for the non-PLT
# reloc should be constant.
.*: file format elf32-cris
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
00082224 R_CRIS_JUMP_SLOT dsofn
Contents of section .*
#...
Contents of section \.rela\.plt:
80134 24220800 0b010000 00000000 .*
Contents of section \.plt:
80140 fce17e7e 7f0d1c22 0800307a 7f0d2022 .*
80150 08003009 7f0d2422 08003009 3f7e0000 .*
80160 00002ffe d8ffffff .*
Contents of section \.text:
80168 5f1d0c00 30096f1d 0c000000 30090000 .*
80178 6f0d1000 0000611a 6f2e5401 08000000 .*
80188 6f3e70df ffff0000 .*
Contents of section \.dynamic:
82190 01000000 07000000 04000000 e4000800 .*
821a0 05000000 18010800 06000000 f8000800 .*
821b0 0a000000 1a000000 0b000000 10000000 .*
821c0 15000000 00000000 03000000 18220800 .*
821d0 02000000 0c000000 14000000 07000000 .*
821e0 17000000 34010800 00000000 00000000 .*
821f0 00000000 00000000 00000000 00000000 .*
82200 00000000 00000000 00000000 00000000 .*
82210 00000000 00000000 .*
Contents of section \.got:
82218 90210800 00000000 00000000 5c010800 .*
82228 54010800 .*