Commit Graph

957 Commits

Author SHA1 Message Date
Jan Beulich
1e118fe363 bfd/ELF: make three local arrays static
... and const. There's no reason to have the compiler copy anonymous
objects onto the stack. And there's also no reason to allow the arrays
to be modifiable.
2025-08-08 11:44:12 +02:00
Alan Modra
97b6ffe44b Move struct plugin_data_struct to plugin.c
It isn't needed anywhere except plugin.c.  The typedef can disappear.
Also make a forward declaraion for ld_plugin_input_file in plugin.h
so that this header can be used without first including plugin-api.h.

bfd/
	* plugin.h (struct ld_plugin_input_file): Forward declare.
	(struct plugin_data_struct): Move to..
	* plugin.c: ..here.
	(add_symbols): Size plugin_data without using type.
	* archive.c: Don't include plugin-api.h.
	* elflink.c: Likewise.
	* format.c: Likewise.
binutils/
	* ar.c: Don't include plugin-api.h or ansidecl.h.  Only
	include plugin.h when BFD_SUPPORTS_PLUGINS.
	* nm.c: Don't include plugin-api.h.  Only include plugin.h
	when BFD_SUPPORTS_PLUGINS.
	* objcopy.c: Likewise.
ld/
	* ldfile.c: Don't include plugin-api.h.
	* ldmain.c: Likewise.
2025-08-07 22:14:49 +09:30
Indu Bhagat
6ab3f09a68 gas: elf: binutils: add new section type SHT_GNU_SFRAME
So far, SFrame sections were of type SHT_PROGBITS.

As per ELF specification, SHT_PROGBITS indicates that the section holds
information defined by the program, whose format and meaning are
determined solely by the program.

On the linker side, SHT_PROGBITS should be reserved for the simple "cat
contents after applying relocs" semantics.

Currently, the only way to know that a section contains SFrame stack
trace data is if consumer checks for section name.  Such a check for
section name is not quite conformant to ELF principles.

Some of this was discussed here
https://sourceware.org/pipermail/binutils/2025-March/140181.html

With this change, the SFrame sections generated by gas, ld will have
section type set to SHT_GNU_SFRAME.   The new section type is defined in
the SHT_LOOS/SHT_HIOS space.  The SFrame parsing routine
_bfd_elf_parse_sframe () now admits sections only when the the section
type is SHT_GNU_SFRAME.

No special handling / validation is done at the moment for the case of
manual creation of SFrame sections via obj_elf_section ().  Add function
level comments for now to add a note about this.

Although the default handling for (sh_type >= SHT_LOOS && sh_type <=
SHT_HIOS) is sufficient when SHT_GNU_SFRAME is in that range, it makes
sense to add it as a case of its own.

bfd/
	* elf-sframe.c (_bfd_elf_parse_sframe): Check if section type is
	SHT_GNU_SFRAME.
	(_bfd_elf_set_section_sframe): Set SHT_GNU_SFRAME for output
	SFrame section.
	* elflink.c (obj_elf_section): Use section type for check
	instead of section name.
	* elfxx-x86.c: Set SHT_GNU_SFRAME for SFrame sections for
	.plt* sections.
	* elf.c (bfd_section_from_shdr): Add case for SHT_GNU_SFRAME.
binutils/
	* readelf.c (get_os_specific_section_type_name): Add
	SHT_GNU_SFRAME.
gas/
	* NEWS: Announce emitted SFrame sections have SHT_GNU_SFRAME
	set.
	* config/obj-elf.c (obj_elf_attach_to_group): Add comments to
	indicate no special handling for SFrame yet.
	* dw2gencfi.c (cfi_finish): Set SHT_GNU_SFRAME for emitted
	SFrame section.
ld/
	* NEWS: Announce emitted SFrame sections have SHT_GNU_SFRAME
	set.
gas/testsuite/
	* gas/cfi-sframe/cfi-sframe.exp: Add new test.
	* gas/cfi-sframe/cfi-sframe-common-1b.d: New test.
	* gas/cfi-sframe/cfi-sframe-common-1b.s: New test.
include/
	* elf/common.h (SHT_GNU_SFRAME): Add new section type for SFrame
	stack trace information.
libsframe/doc/
	* sframe-spec.texi: Add expected ELF section type.
2025-07-11 23:32:58 -07:00
Indu Bhagat
879d24debd bfd: fix a minor typo 2025-06-16 15:34:27 -07:00
Indu Bhagat
3ba8e33726 bfd: sframe: fix typo in comments
bfd/
	* elflink.c (elf_link_input_bfd): Replace ctf frame with SFrame.
2025-06-06 13:44:52 -07:00
H.J. Lu
2cec91421e ld: Skip the LTO archive member only for the earlier DSO
commit 2707d55e53
Author: Michael Matz <matz@suse.de>
Date:   Mon Mar 31 15:57:08 2025 +0200

skipped the LTO archive member even when the earlier item is also an
archive.  Instead, skip the LTO archive member only if the earlier item
is a shared library.

bfd/

	PR ld/32846
	PR ld/32854
	* elflink.c (elf_link_add_archive_symbols): Skip the LTO archive
	member only if the earlier item is a shared library.

ld/

	PR ld/32846
	PR ld/32854
	* testsuite/ld-plugin/lto.exp: Run ld/32846 test.
	* testsuite/ld-plugin/pr32846a.c: New file.
	* testsuite/ld-plugin/pr32846b.c: Likewise.
	* testsuite/ld-plugin/pr32846c.c: Likewise.
	* testsuite/ld-plugin/pr32846d.c: Likewise.
	* testsuite/ld-plugin/pr32846e.c: Likewise.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-04-10 10:29:28 -07:00
Alan Modra
d145893383 PR32858 ld segfault on fuzzed object
We missed one place where it is necessary to check for empty groups.

	PR 32858
	* elflink.c (elf_gc_sweep): Protect against empty group.
2025-04-10 19:45:59 +09:30
Michael Matz
2707d55e53 [lto] Fix symlookup in archives vs shared
when a shared library defines 'foo@@FOO' (default version),
a static archive defines 'foo', the shared lib comes in front
of the archive and under effect of --as-needed, and the requesting
object file uses LTO, then the link editor was wrongly including
the definition from the static archive.  It must use the one
from the shared lib, like in the non-LTO or the --no-as-needed case.
See the added testcase that would wrongly print "FAIL" before
this patch.

The problem stems from several connected problems:
(1) only the decorated symbol was entered into first_hash (the hash
    table designed to handle definition order in the pre-LTO-plugin
    phase of the symbol table walks)
(2) in the archive symbol walk only the undecorated name would be
    looked up in first_hash (and hence not found due to (1))
(3) in the archive symbol walk first_hash would only be consulted
    when the linker hash table had a defined symbol.  In pre-LTO
    phase shared lib symbols aren't entered into the linker symbol
    table.

So: add also the undecorated name into first_hash when it stems from
a default version and consult first_hash in the archive walker also
for currently undefined symbols.  If it has an entry which doesn't
point to the archive, then it comes from an earlier library (shared or
static), and so _this_ archive won't provide the definition.
2025-04-07 16:37:07 +02:00
Matthieu Longo
011e50143f clean-up: move writing of build attributes section into a function
- add obj_build_attributes to struct elf_backend_data similarly sframe.
- new function _bfd_elf_write_section_build_attributes encapsulating the
  writing of the build attributes section into a function.
2025-03-04 11:02:03 +00:00
Alan Modra
104443510a Use bfd_link_align_section in a few more places
Some of these aren't relevant to the relro bug.  Some are.  They all
matter if early estimation of section layout needs to be good.

	PR ld/32690
	* elf32-bfin.c (bfin_adjust_dynamic_symbol),
	* elf32-hppa.c (elf32_hppa_late_size_sections),
	* elf32-microblaze.c (microblaze_elf_adjust_dynamic_symbol),
	* elf32-nds32.c (nds32_elf_adjust_dynamic_symbol),
	* elf64-ppc.c (size_global_entry_stubs),
	* elflink.c (_bfd_elf_tls_setup),
	* elfxx-mips.c (mips_elf_add_la25_intro),
	(mips_elf_add_la25_trampoline),
	(_bfd_mips_elf_adjust_dynamic_symbol),
	* elfxx-x86.c (_bfd_x86_elf_late_size_sections): Use
	bfd_link_align_section to ensure correct output section
	alignment.
2025-02-18 11:26:55 +10:30
Alan Modra
d26161914c PR 32603, more ld -w misbehaviour
Commit 8d97c1a53f claimed to replace all einfo calls using %F with
a call to fatal.  It did so only for the ld/ directory.  This patch
adds a "fatal" to linker callbacks, and replaces those calls in bfd/
too.
2025-02-18 09:16:57 +10:30
Alan Modra
230a788eb2 PR32690, assertion failure in lang_size_relro_segment
This introduces a new function which should be used whenever the
linker needs to increase section alignment after mapping input to
output sections.

	PR ld/32690
	* linker.c (bfd_link_align_section): New function.
	* elflink.c (_bfd_elf_adjust_dynamic_copy): Use it.
	* bfd-in2.h: Regenerate.
2025-02-18 09:16:57 +10:30
Nick Clifton
b425859021 Fix another illegal memory access triggered by corrupt ELF input files.
PR 32644
2025-02-05 16:27:38 +00:00
Nick Clifton
931494c9a8 Add even more checks for corrupt input when processing relocations for ELF files.
PR 32643
2025-02-05 15:43:04 +00:00
Nick Clifton
18cc11a277 Prevent illegal memory access when checking relocs in a corrupt ELF binary.
PR 32641
2025-02-05 14:31:10 +00:00
Nick Clifton
f9978defb6 Prevent illegal memory access when indexing into the sym_hashes array of the elf bfd cookie structure.
PR 32636
2025-02-05 11:15:11 +00:00
H.J. Lu
13bc088de0 elflink.c: Replace bed->dynamic_sec_flags with flags
Since at the function entry, there is

  flags = bed->dynamic_sec_flags;

we can replace bed->dynamic_sec_flags with flags.

	* elflink.c (_bfd_elf_create_got_section): Replace
	bed->dynamic_sec_flags with flags.
	(_bfd_elf_link_create_dynamic_sections): Likewise.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-02-04 13:01:24 +08:00
Alan Modra
ee8f3b6c78 ld compact eh-frame leak
u.compact.extries wasn't being freed anywhere.  Free it when
destroying the linker hash table.  Also free u.dwarf.aray there in
case errors result in the linker not getting to the slightly earlier
free in write_dwarf_eh_frame_hdr.

	* elf-eh-frame.c (write_dwarf_eh_frame_hdr): Don't exit without
	freeing u.dwarf.array.
	* elflink.c (_bfd_elf_link_hash_table_free): Free u.compact.entries
	and u.dwarf.array.
2025-01-23 15:38:50 +10:30
Alan Modra
c785932bb5 Re: elflink.c memory leaks
* elflink.c (elf_link_add_object_symbols): Free old_strtab
	in another code path.  Revert one unnecessary change in last
	patch.
2025-01-20 18:16:15 +10:30
Alan Modra
3a8864b3aa reloc caching
This arranges to free section relocs cached in elf_section_data.  To
do that, some relocs stored there need to use bfd_malloc buffers
rather than bfd_alloc ones.

	* elf.c (_bfd_elf_free_cached_info): Free relocs.
	* elf32-ppc.c (ppc_elf_relax_section): Realloc relocs rather
	than malloc, copy, free old.
	* elf64-ppc.c (get_relocs): bfd_malloc relocs.
	* elflink.c (_bfd_elf_link_info_read_relocs): Always
	bfd_malloc relocs.
2025-01-20 07:13:46 +10:30
Alan Modra
cb6326b5ce sec->alloced and freeing section contents
This modifies _bfd_elf_free_cached_info to unmap/free section
contents.  To do that we need to *not* free sections where contents
are bfd_alloc'd or point to constant strings or somesuch.  I've chosen
to implement this be adding another flag to struct bfd_section,
"alloced" to say the section contents can't be freed.  Most of the
patch is about setting that flag in many places.
2025-01-20 07:13:46 +10:30
Alan Modra
049467c758 Free symtab_hdr.contents and a cache_size correction
symtab_hdr.contents looks to be malloc'd memory, except in one case.
Change that one case to also be malloc'd and free when we are done.

	* elf.c (swap_out_syms): bfd_malloc outbound_syms.
	(_bfd_elf_free_cached_info): Free symtab_hdr.contents.
	* elflink.c (init_reloc_cookie): Correct cache_size.  locsyms
	is an array of Elf_Internal_Sym.
2025-01-15 22:37:16 +10:30
Alan Modra
8c0361c7bb elflink.c memory leaks
Many targets leaked parts of the elf_link_hash_table.  Fix that by
making _bfd_elf_link_hash_table_init set up hash_table_free correctly,
so that targets that extend elf_link_hash_table without adding
anything that needs freeing, will use _bfd_elf_link_hash_table_free.

	* elflink.c (elf_link_add_object_symbols): Always free
	nondeflt_vers.  Don't return false without freeing.
	(_bfd_elf_link_hash_table_init): Set hash_table_free here..
	(_bfd_elf_link_hash_table_create): ..rather than here.
	(elf_link_swap_symbols_out): Don't free strtab here..
	(elf_link_add_object_symbols): ..do so here instead.  Don't
	omit freeing on some error return paths.
2025-01-15 22:37:16 +10:30
Alan Modra
701fe09b04 eh-frame memory leaks
The set_loc array attached to eh-frame sec_info isn't freed, and is
used in _bfd_elf_eh_frame_section_offset.  Rather than finding a
suitable late stage of linking past any b_e_e_f_s_o use, I decided
this might as well persist until the bfd is closed.
Some memory is freed in _bfd_elf_discard_section_eh_frame_hdr, but
the function isn't always called, so fix that too.

	* elf-eh-frame.c (_bfd_elf_parse_eh_frame): bfd_alloc the
	set_loc array.
	(find_merged_cie): Use bfd_malloc rather than malloc.
	(_bfd_elf_discard_section_eh_frame_hdr): Move condition under
	which this function does anything except free memory from..
	* elflink.c (bfd_elf_discard_info): ..here.
2025-01-15 22:37:16 +10:30
Alan Modra
e8e7cf2abe Update year range in copyright notice of binutils files 2025-01-01 18:29:57 +10:30
Alan Modra
f92b077ee7 Remove _bfd_elf_link_hash_table_init target_id param
hash_table_id can be set from elf_backend_data, now that all targets
have matching ELF_TARGET_ID and hash_table_init target_id.
2024-12-19 08:06:37 +10:30
Alan Modra
a030e43267 Re: score and mmix target_id
elflink.c checks elf_object_id(ibfd) == elf_hash_table_id(hash_table)
in a number of places.  Make them match.
2024-12-17 14:32:46 +10:30
Alan Modra
32dc367249 Report bfd_merge_sections error
PR 32260
bfd/
	* elfxx-target.h (bfd_elfNN_bfd_merge_sections): Default to
	bfd_generic_merge_sections when using the generic linker.
	* elflink.c (_bfd_elf_merge_sections): Return error from
	_bfd_merge_sections.  Abort on wrong hash table.
ld/
	* ldlang.c (lang_process): Report bfd_merge_sections error.
2024-10-20 17:15:53 +10:30
Alan Modra
76eab8f47a PR32266, segv when linking libclang_rt.asan-powerpc64.so
Change the mmap support added with commit 9ba56acee5 to always mmap
memory with PROT_READ | PROT_WRITE.  Prior to that commit most file
contents were read into a buffer allocated with bfd_alloc or
bfd_malloc and thus the memory was read/write.  Even after that commit
any section contents with relocations must be read/write to apply the
relocs.  Making them all read/write is not a major change, and it
should not introduce any measurable linker slowdown for contents that
are not modified.  More importantly, it removes a BFD behaviour
difference that only triggers when large files are involved.

	PR 32266
	PR 32109
	* libbfd.c (bfd_mmap_local): Remove prot param.  Always mmap
	with PROT_READ | PROT_WRITE.  Adjust all calls.
	(_bfd_mmap_temporary): Rename from _bfd_mmap_readonly_temporary.
	(_bfd_munmap_temporary): Rename from _bfd_munmap_readonly_temporary.
	_bfd_mmap_persistent): Rename from _bfd_mmap_readonly_persistent.
	(_bfd_generic_get_section_contents): Use PROT_READ | PROT_WRITE
	regardless of relocs.
	* libbfd-in.h: Update decls to suit.  Make non-USE_MMAP variants
	static inline functions.
	* elflink.c: Update all uses of _bfd_mmap functions.
	* elf.c: Likewise.
	(bfd_elf_get_str_section): Revert commit 656f8fbaae.
	* libbfd.h: Regenerate.
2024-10-16 14:23:27 +10:30
Jan Beulich
1f1b5e506b bfd/ELF: restrict file alignment for object files
While for executables properly aligning sections within the file can be
quite relevant, the same is of pretty little importance for relocatable
object files. Avoid passing "true" into
_bfd_elf_assign_file_position_for_section() when dealing with object
files, but compensate minimally by applying log_file_align in such
cases as a cap to the alignment put in place.
2024-10-11 08:19:34 +02:00
Alan Modra
124deb3101 Revised "Don't return (null) from bfd_elf_sym_name"
Commit 68bbe11833 results in a lot of follow up work, much of which
likely is still to be done. (And yes, since this is all for corrupted
or fuzzed object files, a whole lot of work doesn't much benefit
anyone.  It was a bad idea to put NULL in asymbol->name.)  So I'm
changing the approach to instead put a unique empty string for symbols
with a corrupted st_name.  An empty string won't require much work to
ensure nm, objcopy, objdump etc. won't crash, since these tools
already must work with unnamed local symbols.

The unique empty string is called bfd_symbol_error_name.  This patch
uses that name string for corrupted symbols in the ELF and COFF
backends.  Such symbols are displayed by nm and objdump as the
translated string "<corrupt>", which is what the COFF backend used to
put directly into corrupted symbols.

ie. it's the way I should have written the original patch, plus a few
tides and cleanups I retained from the reverted patches.
2024-10-08 15:12:19 +10:30
Alan Modra
e8859e4947 Revert "elf.c and elflink.c fixes for commit 68bbe1183379"
This reverts commit 389fdfbe0d.
2024-10-08 15:12:14 +10:30
Alan Modra
389fdfbe0d elf.c and elflink.c fixes for commit 68bbe11833
Plus some tidies to swap_out_syms.

	* elf.c (swap_out_syms): Handle NULL sym name.  Use correct type
	for return of _bfd_elf_strtab_add.  Simplify.
	* elflink.c (bfd_elf_match_symbols_in_sections): Handle NULL
	sym name.
2024-10-05 10:58:37 +09:30
H.J. Lu
a6f8fe0a9e lto: Don't include unused LTO archive members in output
When plugin_object_p is called by elf_link_is_defined_archive_symbol to
check if a symbol in archive is a real definition, set archive member
plugin_format to bfd_plugin_yes_unused to avoid including the unused LTO
archive members in linker output.  When plugin_object_p is called as
known used, call plugin claim_file if plugin_format is bfd_plugin_unknown
or bfd_plugin_yes_unused.

To get the proper support for archives with LTO common symbols with GCC,
the GCC fix for

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116361

is needed.

bfd/

	PR ld/32083
	* archures.c (bfd_arch_get_compatible): Treat bfd_plugin_yes_unused
	the same as bfd_plugin_yes.
	* elflink.c (elf_link_is_defined_archive_symbol): Likewise.
	* bfd.c (bfd_plugin_format): Add bfd_plugin_yes_unused.
	* plugin.c (try_claim): Try claim_file_v2 first.
	* bfd-in2.h: Regenerated.

ld/

	PR ld/32083
	* plugin.c (plugin_call_claim_file): Add an argument to return
	if LDPT_REGISTER_CLAIM_FILE_HOOK_V2 is used.
	(plugin_object_p): When KNOWN_USED is false, we call plugin
	claim_file if plugin_format is bfd_plugin_unknown and set
	plugin_format to bfd_plugin_yes_unused on LTO object.  When
	KNOWN_USED is true, we call plugin claim_file if plugin_format
	is bfd_plugin_unknown or bfd_plugin_yes_unused.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2024-08-15 03:54:11 -07:00
H.J. Lu
549bc65f05 elf: Never set non_ir_ref_regular for debug reference
Never set non_ir_ref_regular for debug reference since references in
debug sections shouldn't impact LTO output.

	* elflink.c (elf_link_add_object_symbols): Don't check strip for
	references in debug sections when setting non_ir_ref_regular.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2024-08-13 15:43:05 -07:00
Alan Modra
ec8f5671b4 PR32067, ld -Wl,--oformat,binary crash in _bfd_elf_link_keep_memory
The direct fix for this segfault is to test for a non-NULL bed in
_bfd_elf_link_keep_memory, but also there isn't much point in running
code for LTO if the output is binary.

	PR 32067
	* elflink.c (_bfd_elf_link_keep_memory): Test for non-NULL bed.
	(elf_link_add_object_symbols): Don't run the loop setting
	non_ir_ref_regular if the output hash table is not ELF.
2024-08-10 10:28:32 +09:30
H.J. Lu
7757f66fdb elf: Add glibc version dependency only if needed
There is no need to add a needed glibc version if the glibc base version
includes the needed glibc version.

	PR ld/31966
	* elflink.c (elf_link_add_glibc_verneed): Add glibc_minor_base.
	Skip if the glibc base version includes the needed glibc version.
	(_bfd_elf_link_add_glibc_version_dependency): Initialize
	glibc_minor_base to INT_MAX and pass it to
	elf_link_add_glibc_verneed.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2024-07-09 14:34:54 -07:00
mengqinggang
5f4fa40e4d LoongArch: Make align symbol be in same section with alignment directive
R_LARCH_ALIGN (psABI v2.30) requires a symbol index. The symbol is only
created at the first time to handle alignment directive. This means that
all other sections may use this symbol. If the section of this symbol is
discarded, there may be problems. Search it in its own section.

Remove elf_backend_data.is_rela_normal() function added at commit daeda14191.

Co-authored-by: Jinyang He <hejinyang@loongson.cn>
Reported-by: WANG Xuerui <git@xen0n.name>
Link: https://lore.kernel.org/loongarch/2abbb633-a10e-71cc-a5e1-4d9e39074066@loongson.cn/T/#t
2024-06-04 19:47:20 +08:00
Alan Modra
9cf3c87e16 Re: elf: Strip unreferenced weak undefined symbols
PR ld/31652
	* elflink.c (_bfd_elf_link_output_relocs): Don't segfault
	on NULL rel_hash.
2024-04-19 16:48:03 +09:30
H.J. Lu
eebad48efe elf: Strip unreferenced weak undefined symbols
Linker will resolve an undefined symbol only if it is referenced by
relocation.  Unreferenced weak undefined symbols serve no purpose.
Weak undefined symbols appear in the dynamic symbol table only when they
are referenced by dynamic relocation.  Mark symbols with relocation and
strip undefined weak symbols if they don't have relocation and aren't
in the dynamic symbol table.

bfd/

	PR ld/31652
	* elf-bfd.h (elf_link_hash_entry): Add has_reloc.
	* elf-vxworks.c (elf_vxworks_emit_relocs): Set has_reloc.
	* elflink.c (_bfd_elf_link_output_relocs): Likewise.
	(elf_link_output_extsym): Strip undefined weak symbols if they
	don't have relocation and aren't in the dynamic symbol table.

ld/

	PR ld/31652
	* testsuite/ld-elf/elf.exp: Run undefweak tests.
	* testsuite/ld-elf/undefweak-1.rd: New file.
	* testsuite/ld-elf/undefweak-1a.s: Likewise.
	* testsuite/ld-elf/undefweak-1b.s: Likewise.
	* testsuite/ld-x86-64/weakundef-1.nd: Likewise.
	* testsuite/ld-x86-64/weakundef-1a.s: Likewise.
	* testsuite/ld-x86-64/weakundef-1b.s: Likewise.
	* testsuite/ld-x86-64/x86-64.exp: Run undefweak tests.
2024-04-18 19:17:17 -07:00
H.J. Lu
c2fbf57864 elf: Skip the archive if the symbol isn't referenced
Also skip the archive if the symbol isn't referenced by a regular object.

bfd/

	PR ld/31644
	* elflink.c (elf_link_add_archive_symbols): Also skip the archive
	if the symbol isn't referenced by a regular object.

ld/

	PR ld/31644
	* testsuite/ld-plugin/lto.exp: Run PR ld/31644 tests.
	* testsuite/ld-plugin/pr31644a.c: New test.
	* testsuite/ld-plugin/pr31644b.c: Likewise.
	* testsuite/ld-plugin/pr31644c.c: Likewise.
2024-04-16 17:45:23 -07:00
Alan Modra
de9dc65bd4 asan: heap buffer overflow elf_link_add_to_first_hash
Seen on mmix.
mmix  +FAIL: ld-misc/defsym1
mmix  +FAIL: sysroot-prefix common plain -Lpath, quoted
mmix  +FAIL: sysroot-prefix common plain -Lpath, unquoted
mmix  +FAIL: sysroot-prefix common full-path, quoted
mmix  +FAIL: sysroot-prefix common full-path, unquoted
mmix  +FAIL: sysroot-prefix common plain =-prefixed with empty, quoted
mmix  +FAIL: sysroot-prefix common plain =-prefixed with empty, unquoted
mmix  +FAIL: sysroot-prefix common plain $SYSROOT-prefixed with empty, quoted
mmix  +FAIL: sysroot-prefix common plain $SYSROOT-prefixed with empty, unquoted
mmix  +FAIL: sysroot-prefix common plain =-prefixed -Lpath, quoted
mmix  +FAIL: sysroot-prefix common plain =-prefixed -Lpath, unquoted
mmix  +FAIL: sysroot-prefix common plain $SYSROOT-prefixed -Lpath, quoted
mmix  +FAIL: sysroot-prefix common plain $SYSROOT-prefixed -Lpath, unquoted
mmix  +FAIL: sysroot-prefix common full-path =-prefixed without, quoted
mmix  +FAIL: sysroot-prefix common full-path =-prefixed without, unquoted
mmix  +FAIL: sysroot-prefix common full-path $SYSROOT-prefixed without, quoted
mmix  +FAIL: sysroot-prefix common full-path $SYSROOT-prefixed without, unquoted

==3746597==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6070000007a0 at pc 0x56d87b0d1a40 bp 0x7fffb1629bf0 sp 0x7fffb1629be0
READ of size 8 at 0x6070000007a0 thread T0
    #0 0x56d87b0d1a3f in elf_link_add_to_first_hash /home/alan/src/binutils-gdb/bfd/elflink.c:4312

mmix uses bfd_link_generic_hash_table.

	* elflink.c (_bfd_elf_archive_symbol_lookup): Dont use first_hash
	unless the hash table is bfd_link_elf_hash_table.
	(elf_link_add_archive_symbols): Likewise.
2024-04-11 17:05:15 +09:30
H.J. Lu
c3460201a6 elf: Fix a memory leak in _bfd_elf_add_dynamic_entry
Normally, the section contents is allocated by bfd_alloc which is freed
when the object is closed.  But the .dynamic section contents is allocated
by bfd_realloc, which should be freed by calling free.  Add a dynamic
field to elf_link_hash_table for the .dynamic section and free its
contents in _bfd_elf_link_hash_table_free.

	* elf-bfd.h (elf_link_hash_table): Add dynamic.
	* elflink.c (_bfd_elf_link_create_dynamic_sections): Set the
	dynamic field in elf_link_hash_table.
	(_bfd_elf_add_dynamic_entry): Use hash_table->dynamic.
	(_bfd_elf_strip_zero_sized_dynamic_sections): Likewise.
	(bfd_elf_add_dt_needed_tag): Likewise.
	(elf_finalize_dynstr): Likewise.
	(_bfd_elf_link_hash_table_free): Free htab->dynamic->contents.
	(bfd_elf_final_link): Use htab->dynamic.
	* elfxx-x86.c (_bfd_x86_elf_finish_dynamic_sections): Use
	htab->elf.dynamic.
2024-04-10 19:50:01 -07:00
H.J. Lu
c411ee9883 elf: Call bfd_malloc instead xmalloc
* elflink.c (elf_link_add_object_symbols): Call bfd_malloc
	instead of xmalloc.
2024-04-06 05:07:33 -07:00
Alan Modra
e7e05a9dd0 Don't have first_hash entries of strings that can be freed.
Seen running "LTO 1" under valgrind.
==1443263== Invalid read of size 1
==1443263==    at 0x484CFE4: strcmp (vg_replace_strmem.c:939)
==1443263==    by 0x56E16C: bfd_hash_lookup (hash.c:564)
==1443263==    by 0x5A3C8F: elf_link_add_to_first_hash (elflink.c:4316)
==1443263==    by 0x5AE60F: elf_link_add_object_symbols (elflink.c:5663)
==1443263==    by 0x5B0672: bfd_elf_link_add_symbols (elflink.c:6333)
==1443263==    by 0x41448F: load_symbols (ldlang.c:3129)
==1443263==    by 0x4149D8: open_input_bfds (ldlang.c:3621)
==1443263==    by 0x414968: open_input_bfds (ldlang.c:3569)
==1443263==    by 0x4166A2: lang_process (ldlang.c:8162)
==1443263==    by 0x4194D5: main (ldmain.c:504)
==1443263==  Address 0x525e230 is 192 bytes inside a block of size 4,064 free'd
==1443263==    at 0x484810F: free (vg_replace_malloc.c:974)
==1443263==    by 0x8D4D87: objalloc_free_block (objalloc.c:248)
==1443263==    by 0x5AEACC: elf_link_add_object_symbols (elflink.c:5790)
==1443263==    by 0x5B0672: bfd_elf_link_add_symbols (elflink.c:6333)
==1443263==    by 0x41448F: load_symbols (ldlang.c:3129)
==1443263==    by 0x4149D8: open_input_bfds (ldlang.c:3621)
==1443263==    by 0x414968: open_input_bfds (ldlang.c:3569)
==1443263==    by 0x4166A2: lang_process (ldlang.c:8162)
==1443263==    by 0x4194D5: main (ldmain.c:504)

	PR ld/31482
	PR ld/31489
	* elflink.c (elf_link_add_to_first_hash): Add "copy" param.
	(elf_link_add_object_symbols): Flag that name must be copied
	when appending version string to symbol name.
2024-04-06 16:35:35 +10:30
H.J. Lu
816fd3dced elf: Use elf_link_first_hash_entry for first_hash
Add elf_link_first_hash_entry and use it for first_hash.  Free first_hash
before freeing the main hash table.

	PR ld/31482
	PR ld/31489
	* elf-bfd.h (elf_link_hash_table): Change first_hash to
	bfd_hash_table.
	* elflink.c (elf_link_first_hash_entry): New.
	(elf_link_first_hash_newfunc): Likewise.
	(elf_link_add_to_first_hash): Updated.
	(elf_link_add_object_symbols): Initialize first_hash with
	elf_link_first_hash_newfunc.
	(elf_link_add_object_symbols): Updated.
	(elf_link_add_archive_symbols): Likewise.
	(_bfd_elf_link_hash_table_free): Free first_hash before freeing
	the main hash table.
2024-04-05 16:49:09 -07:00
H.J. Lu
c0419c024b elf: Always honor the first definition in shared object and archive
GCC doesn't put builtin function symbol references, which are defined in
the shared C library, in the IR symbol table.  When linker rescans shared
objects and archives for newly added symbol references generated from the
IR inputs, it skips definitions of the builtin functions in shared
objects and archives.

Add first_hash to elf_link_hash_table to track unreferenced definitions
defined first in shared objects and archives.  Always use them to resolve
any references.

bfd/

	PR ld/31482
	PR ld/31489
	* elf-bfd.h (elf_link_hash_table): Add first_hash.
	* elflink.c (elf_link_add_to_first_hash): New function.
	(elf_link_add_object_symbols): Initialize first_hash for an IR
	input.  Always use the first definition in shared object.  Add
	the first unreferenced dynamic definition to first_hash.
	(_bfd_elf_archive_symbol_lookup): Add the first unreferenced
	definition to first_hash..
	(elf_link_add_archive_symbols): Use the symbol definition in
	archive if symbol is defined first in this archive.
	(_bfd_elf_link_hash_table_free): Also free first_hash.

ld/

	PR ld/31482
	PR ld/31489
	* testsuite/ld-plugin/lto.exp: Add PR ld/31482 and PR ld/31489
	tests.
	* testsuite/ld-elf/pr31482a-no-lto.c: New file.
	* testsuite/ld-elf/pr31482b-no-lto.c: Likewise.
	* testsuite/ld-elf/pr31482c-no-lto.c: Likewise.
	* testsuite/ld-elf/pr31482d-no-lto.c: Likewise.
	* testsuite/ld-plugin/pass1.out: Likewise.
	* testsuite/ld-plugin/pr31482a.c: Likewise.
	* testsuite/ld-plugin/pr31482b.c: Likewise.
	* testsuite/ld-plugin/pr31482c.c: Likewise.
2024-04-05 05:02:38 -07:00
Alan Modra
b43b352837 Memory corruption with USE_MMAP
mips64-linux-gnuabi64  +FAIL: GOT page 4 (two files)
mipsel-linux-gnu  +FAIL: GOT page 4 (two files)
mipsisa32el-linux-gnu  +FAIL: GOT page 4 (two files)
mips-linux-gnu  +FAIL: GOT page 4 (two files)
powerpc64-freebsd  +FAIL: relocatable relaxing large
powerpc64le-linux-gnu  +FAIL: relocatable relaxing large
powerpc64-linux-gnu  +FAIL: relocatable relaxing large
powerpc-eabisim  +FAIL: relocatable relaxing large
powerpc-eabivle  +FAIL: relocatable relaxing large
powerpc-freebsd  +FAIL: relocatable relaxing large
powerpcle-elf  +FAIL: relocatable relaxing large
powerpc-linux-gnu  +FAIL: relocatable relaxing large

	* elflink.c (bfd_elf_final_link): Heed bed->use_mmap when
	sizing buffers, not just USE_MMAP.
2024-04-04 14:43:49 +10:30
Alan Modra
9fd82d9142 Fix uninitialised variable errors
Commit c6291d749a introduced a number of errors, found by clang.

elf.c:456:7: error: variable 'alloc_ext_size' is used uninitialized whenever 'if' condition is true [-Werror,-Wsometimes-uninitialized]
  if (_bfd_mul_overflow (symcount, extsym_size, &amt))
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elf.c:464:7: error: variable 'alloc_extshndx_size' is used uninitialized whenever 'if' condition is true [-Werror,-Wsometimes-uninitialized]
  if (bfd_seek (ibfd, pos, SEEK_SET) != 0
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
elflink.c:2837:11: error: variable 'alloc1_size' is used uninitialized whenever 'if' condition is true [-Werror,-Wsometimes-uninitialized]
      if (internal_relocs == NULL)
          ^~~~~~~~~~~~~~~~~~~~~~~
elflink.c:12595:16: error: variable 'ext_size' set but not used [-Werror,-Wunused-but-set-variable]
                      size_t ext_size = 0;

	* elf.c (bfd_elf_get_elf_syms): Fix use of uninitialised variables.
	* elflink.c (_bfd_elf_link_info_read_relocs): Likewise.
	(bfd_elf_final_link): Fix set but not used warning.
2024-04-04 11:33:13 +10:30
H.J. Lu
a9505c7420 elf: Add _bfd_elf_link_m[un]map_section_contents
To copy input section contents, add _bfd_elf_link_mmap_section_contents
and _bfd_elf_link_munmap_section_contents to mmap in the input sections.

	* elf-bfd.h (_bfd_elf_link_mmap_section_contents): New.
	(_bfd_elf_link_munmap_section_contents): Likewise.
	* elf.c (elf_mmap_section_contents): New.
	(_bfd_elf_mmap_section_contents): Use it.
	(_bfd_elf_link_mmap_section_contents): New.
	(_bfd_elf_link_munmap_section_contents): Likewise.
	* elflink.c (elf_link_input_bfd): Call
	_bfd_elf_link_mmap_section_contents instead of
	bfd_get_full_section_contents.  Call
	_bfd_elf_link_munmap_section_contents to munmap the section
	contents.
	(bfd_elf_final_link): When mmap is used, initialize
	max_contents_size to _bfd_minimum_mmap_size and increase it
	for compressed or linker created sections or sections whose
	rawsize != size.
2024-04-03 09:11:03 -07:00