Commit Graph

4736 Commits

Author SHA1 Message Date
Jan Beulich
cdd8492b05 objdump: permit disassembling multiple individual functions
Compilers may split functions, e.g. into a "hot" and "cold" part, or
they may emit special case instantiations (e.g. as a result of IPA). It
can be helpful to be able to disassemble all of the parts or clones in
one go. Permit using "--disassemble=" multiple times.
2025-03-07 11:24:19 +01:00
Jan Beulich
60e254b701 objdump: properly disassemble successive functions of the same name
... when only their symbol was requested for disassembly. Addressing the
respective FIXME is as easy as coverting the "else" there to an if()
with the opposite condition, thus accounting for the disabling the
original if() may have effected.
2025-03-07 11:23:13 +01:00
Matthieu Longo
3f8f380190 clean-up readelf: simplify and flatten body of process_attributes
- use find_section_by_type() instead of a for-loop.
- reindent the whole function accordingly.
- move declaration of variables nearer from their usage.
- prune else branch by using a goto in the error case.

diff --git a/binutils/readelf.c b/binutils/readelf.c
index 6d3ec65a8a1..878012da8f0 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -19268,42 +19268,32 @@ process_attributes (Filedata * filedata,
                    unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
                    unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
 {
-  Elf_Internal_Shdr * sect;
-  unsigned i;
-  bool res = true;
-
   /* Find the section header so that we get the size.  */
-  for (i = 0, sect = filedata->section_headers;
-       i < filedata->file_header.e_shnum;
-       i++, sect++)
-    {
-      unsigned char * contents;
-      unsigned char * p;
+  Elf_Internal_Shdr * sect = find_section_by_type (filedata, proc_type);
+  if (sect == NULL)
+    sect = find_section_by_type (filedata, SHT_GNU_ATTRIBUTES);

-      if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
-       continue;
+  if (sect == NULL)
+    /* No section, exit without error.  */
+    return true;

-      contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
-                                             sect->sh_size, _("attributes"));
+  unsigned char * contents = (unsigned char *)
+    get_data (NULL, filedata, sect->sh_offset, 1, sect->sh_size, _("attributes"));
   if (contents == NULL)
-       {
-         res = false;
-         continue;
-       }
+    return false;

-      p = contents;
+  bool res = true;
+  unsigned char * p = contents;
   /* The first character is the version of the attributes.
      Currently only version 1, (aka 'A') is recognised here.  */
   if (*p != 'A')
     {
       printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
       res = false;
+      goto free_data;
     }
-      else
-       {
-         uint64_t section_len;

-         section_len = sect->sh_size - 1;
+  uint64_t section_len = sect->sh_size - 1;
   p++;

   while (section_len > 0)
@@ -19456,10 +19446,9 @@ process_attributes (Filedata * filedata,
            attr_len = 0;
        }
     }
-       }

+free_data:
   free (contents);
-    }

   return res;
 }
2025-03-04 11:02:03 +00:00
Matthieu Longo
1efbe98a4d clean-up: fix conflicting symbol with unknown from bfd/elf-bfd.h 2025-03-04 11:02:02 +00:00
Matthieu Longo
5d526bdf5f clean-up: fix annoying spaces in binutils/readelf.c 2025-03-04 11:02:02 +00:00
Tom Tromey
ef8975b494 Display entry offset for .debug_names
Since commit ad6dde5aaa ("gdb/dwarf: write offset to parent entry for
DW_IDX_parent"), gdb now emits a .debug_names where the DW_IDX_parent
attribute refers to the parent entry's offset -- previously, due to
some confusion in the standard, gdb used the index of the parent's
name table entry.

This patch changes the .debug_names display code to display each
entry's offset.  This makes it easy to refer from a DW_IDX_parent to
the correct entry.

The new output looks like this:

[...]
Symbol table:
[  1] circular1: <0><1> DW_TAG_module DW_IDX_compile_unit=1 DW_IDX_die_offset=<0x19> DW_IDX_GNU_language=19
[...]
[  6] found: <0x28><2> DW_TAG_subprogram DW_IDX_compile_unit=1 DW_IDX_die_offset=<0x38> DW_IDX_GNU_language=19 DW_IDX_parent=<0x0>

Here you can see that DW_IDX_parent=0 refers to "circular1: <0>".
2025-03-03 21:04:07 -07:00
Alan Modra
a8a9fc7429 objdump: is_same_section
This fixes a deficiency in commit 660df28acf, which should have used
the same logic as that in sym_ok.  Ideally both places would not
compare section names, but it can be a little tricky to match a
section in the real object file with a section in a debug file.
Extend commit 39f0547e55 to use section name, vma and size.

	* objcopy (is_same_section): New function.
	(compare_symbols, sym_ok): Use it here.
2025-03-04 08:23:16 +10:30
Alan Modra
7166166ec0 rescoff: ensure file is PE
read_coff_rsrc makes one check on object file contents, the existence
of a .rsrc section.  It doesn't check that the file is PE but blindly
accesses bfd pe_data.  Fix that by adding the necessary checks.
Also, the "resources nest too deep" error isn't an overrun, ie. the
"address out of bounds" message isn't correct.  Fix that too.
2025-03-04 08:23:16 +10:30
Alan Modra
11b6914ce6 windres: delete function forward declaraions
Most of these were not needed, and moving a few functions around
removes the need for any.
2025-03-04 08:23:16 +10:30
Nick Alcock
bf89fce0cf readelf, objdump: fix ctf dict leak
ctf_archive_next returns an opened dict, which must be closed by the caller.

Thanks to Alan Modra for spotting this.

binutils/
	* objdump.c (dump_ctf): Close dict.
	* readelf.c (dump_section_as_ctf): Likewise.
2025-02-28 14:16:29 +00:00
Jonas 'Sortie' Termansen
a3177d19fb Remove unnecessary non-standard & unportable inclusions.
<memory.h> is not needed and not standardized and is just an alias for
<string.h>.

<sys/param.h> is not needed and not standardized and contains a kitchen
sink of various unportable definitions not agreed upon and best done
manually or through other headers.

These fixes are needed to compile binutils on Sortix and other operating
systems with a strict POSIX.1-2024 libc without obsolete features.

Signed-off-by: Jonas 'Sortie' Termansen <sortie@maxsi.org>
2025-02-28 13:24:50 +00:00
Nick Clifton
c619e92beb objdump: Inform users if RELR relocs are present in a file when using the -r or -R options and no regular relocs are present.
PR 32459
2025-02-24 13:44:45 +00:00
Jan Beulich
2b0a62b17f IQ2000: drop maintainer
After I found his email bouncing, Stan, via private communication which
Nick helped with, has indicated that - having retired - he won't any
longer fulfill the maintainer role here.
2025-02-21 10:28:46 +01:00
Tom Tromey
3fddd4e758 Fix "compilation unit" matching in dwarf-font-lock-keywords
Today I learned that, at least on my system (Fedora 40), the printf
"%#x" format will produce "0" rather than "0x0" when given 0 as an
argument.

This causes dwarf-mode.el to not correctly fontify the very first
"Compilation Unit" line it sees.

This patch adapts dwarf-mode.el.  As always, this patch bumps the
version number for easier installation.

I am checking this in.
2025-02-20 09:45:25 -07:00
Alan Modra
cb1861cb8f bintuils/dwarf.c indentation fixes
plus a few other formatting fixes.
2025-02-19 23:11:23 +10:30
Alan Modra
e51fdff7d2 binutils/dwarf.c debug_information leak
It is possible with fuzzed files to have num_debug_info_entries zero
after allocating space for debug_information, leading to multiple
allocations.

	* dwarf.c (process_debug_info): Don't test num_debug_info_entries
	to determine whether debug_information has been allocated,
	test alloc_num_debug_info_entries.
2025-02-19 23:03:11 +10:30
Alan Modra
ba6ad3a18c PR32716, objdump -i memory leak
PR binutils/32716
	* bucomm.c (display_info): Free arg.info.
2025-02-19 08:01:13 +10:30
Alan Modra
619f863c55 dlltool memory leaks
dlltool copies strings with strdup all over the place, seeming to take
the attitude that anything might be modified.  That leads to lots of
memory leaks.  Fixing the leaks by removing the strdup calls of course
means you need to take good care that strings *aren't* modified.  This
isn't as easy as it sounds due to functions like xlate that have
const char* params but then manage to modify the strings.  I've fixed
xlate, but if I've missed something somewhere then this patch likely
will break dlltool.  Testsuite coverage of dlltool isn't good.

The leaks in defparse.y are small.  It also is a little work to verify
that all the strings I'm freeing in defparse.y are in fact malloc'd,
which is no doubt why the leaks are there.

Using bfd_xalloc in make_one_lib_file and functions called from there
results in memory being freed automatically at the bfd_close in
make_one_lib_file, without any fuss.

The patch also makes use of xasprintf to replace xmalloc followed by
sprintf.

	* defparse.y (opt_name2): Free incoming ID strings after
	adding prefix/suffix.
	* dlltool.c (struct ifunct): Constify char* fields.
	(struct iheadt, struct dlist): Likewise.
	(set_dll_name_from_def,	def_heapsize, def_stacksize),
	(def_section, assemble_file): Use xasprintf.
	(def_name, def_library): Free dll_name and name.
	(def_description, new_directove): Don't strdup incoming args.
	(append_import): Likewise.
	(def_import): Free module after appending dllext.
	(run): Free temp_base.
	(scan_filtered_symbols): Don't segfault on NULL strchr return.
	Remove unnecessary strdup.
	(scan_drectve_symbols): Likewise.  Constify pointers.
	Use bfd_malloc_and_get_section.  Use xmemdup.
	(add_excludes): Use xasprintf and xstrdup.
	(gen_exp_file): Free xlate return.  Constify pointer to suit
	struct changes.  Free copy.
	(xlate): Always copy arg.  Use xasprintf and xstrdup.
	(make_imp_label): Add bfd arg.  Use bfd_xalloc.
	(gen_lib_file): Adjust to suit.
	(make_one_lib_file): Likewise.  Use bfd_xalloc for section data
	and relocs.  Simplify code calling xlate, and free xlate return.
	(dll_name_list_free_contents): Flatten recursion.
	(mangle_defs): Free d_export_vec.
	(main): Formatting.  Use xasprintf.
	* resres.c (write_res_id): Free section data.
2025-02-14 09:11:23 +10:30
Alan Modra
dd39a8c388 Fix typo in objdump info/man page 2025-02-10 09:03:06 +10:30
Nick Clifton
2470de6c0c Update with latest changes to src-release.sh 2025-02-04 11:50:32 +00:00
Nick Clifton
f5d5d53e80 Remove a couple of entries in the binutils MAINTAINERS file 2025-01-30 16:01:02 +00:00
Nick Clifton
50505c486e More updated translations 2025-01-21 10:48:02 +00:00
Alan Modra
592819f718 run_dump_test warning/error regexp
This allows you to specify a run_dump_test warning that may or may not
be present using
warning: (warning_text_goes_here)?
ie. the regexp matches an empty string.
2025-01-21 08:42:44 +10:30
Nick Clifton
8ae7da3ae8 Update translations for various sub-directories 2025-01-20 16:19:22 +00:00
Nick Clifton
639dc893ab Update release readme for gold-in-branches change 2025-01-20 16:18:36 +00:00
Nick Clifton
876bcbeb43 Update how-to-make-a-release document after creating the 2.44 branch 2025-01-20 10:29:59 +00:00
Nick Clifton
8c7653ab09 Change version to 2.44.50 and regenerate files 2025-01-19 12:40:46 +00:00
Nick Clifton
572920f968 Add name of 2.44 branch 2025-01-19 12:09:35 +00:00
Nick Clifton
b49d12e2c5 Add markers for bihnutils 2.44 branch 2025-01-19 12:09:01 +00:00
Vladimir Mezentsev
b715bf1f35 gprofng: update binutils/NEWS for 2.44
ChangeLog
2025-01-16  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

	* binutils/NEWS: Updated.
2025-01-17 08:26:46 -08:00
Nick Clifton
978dae651e Have readelf sanitize the program interpreter string before displaying it. 2025-01-16 15:48:40 +00:00
Alan Modra
1439d7d5f3 Fix known minor objdump leak
* objdump.c (main): Free disassembler_options.
2025-01-15 22:19:31 +10:30
Alan Modra
baac6c221e PR32560 stack-buffer-overflow at objdump disassemble_bytes
There's always someone pushing the boundaries.

	PR 32560
	* objdump.c (MAX_INSN_WIDTH): Define.
	(insn_width): Make it an unsigned long.
	(disassemble_bytes): Use MAX_INSN_WIDTH to size buffer.
	(main <OPTION_INSN_WIDTH>): Restrict size of insn_width.
2025-01-15 19:18:46 +10:30
Adhemerval Zanella
80dc29527f ld: Add --enable-memory-seal configure option
Add --enable-memory-seal linker configure option to enable memory
sealing (GNU_PROPERTY_MEMORY_SEAL) by default.

Change-Id: I4ce4ff33657f0f09b1ceb06210b6fcaa501f1799
2025-01-14 13:18:52 -03:00
Adhemerval Zanella
4d890484df elf: Add GNU_PROPERTY_MEMORY_SEAL gnu property
The GNU_PROPERTY_MEMORY_SEAL gnu property is a way to mark binaries
to be memory sealed by the loader, to avoid further changes of
PT_LOAD segments (such as unmapping or change permission flags).
This is done along with Linux kernel (the mseal syscall [1]), and
C runtime supports to instruct the kernel on the correct time during
program startup (for instance, after RELRO handling).  This support
is added along the glibc support to handle the new gnu property [2].

This is a opt-in security features, like other security hardening
ones like NX-stack or RELRO.

The new property is ignored if present on ET_REL objects, and only
added on ET_EXEC/ET_DYN if the linker option is used.  A gnu property
is used instead of DT_FLAGS_1 flag to allow memory sealing to work
with ET_EXEC without PT_DYNAMIC support (at least on glibc some ports
still do no support static-pie).

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8be7258aad44b5e25977a98db136f677fa6f4370
[2] https://sourceware.org/pipermail/libc-alpha/2024-September/160291.html

Change-Id: Id47fadabecd24be0e83cff45653f7ce9a900ecf4
2025-01-14 13:18:43 -03:00
Matthieu Longo
c4ab4dd7bd aarch64 DWARF: add new CFI directive for PAuth_LR
This patch adds a new CFI directive (cfi_negate_ra_state_with_pc) which
set an additional bit in the RA state to inform that RA was signed with
SP but also PC as an additional diversifier.

RA state | Description
0b00     | Return address not signed (default if no cfi_negate_ra_state*)
0b01     | Return address signed with SP (cfi_negate_ra_state)
0b10     | Invalid state
0b11     | Return address signed with SP+PC (cfi_negate_ra_state_with_pc)

Approved-by: Indu Bhagat <indu.bhagat@oracle.com>
Approved-by: Jan Beulich <jbeulich@suse.com>
2025-01-14 10:53:21 +00:00
H.J. Lu
9b854f169d ld: Add LTO and none-LTO output support for ld -r
Link with mixed IR/non-IR objects

* 2 kinds of object files
  o non-IR object file has
    * non-IR sections
  o IR object file has
    * IR sections
    * non-IR sections
    * The output of "ld -r" with mixed IR/non-IR objects should work with:
        o Compilers/linkers with IR support.
	o Compilers/linkers without IR support.
* Add the mixed object file which has
  o IR sections
  o non-IR sections:
    * Object codes from IR sections.
    * Object codes from non-IR object files.
  o Object-only section:
    * With section name ".gnu_object_only" and SHT_GNU_OBJECT_ONLY type
    on ELF:
    https://gitlab.com/x86-psABIs/Linux-ABI
    #define SHT_GNU_OBJECT_ONLY 0x6ffffff8	/* Object only */
    * Contain non-IR object file.
    * Input is discarded after link.
* Linker action:
  o Classify each input object file:
    * If there is a ".gnu_object_only" section, it is a mixed object file.
    * If there is a IR section, it is an IR object file.
    * Otherwise, it is a non-IR object file.
  o Relocatable non-IR link:
    * Prepare for an object-only output.
    * Prepare for a regular output.
    * For each mixed object file:
      * Add IR and non-IR sections to the regular output.
      * For object-only section:
	* Extract object only file.
	* Add it to the object-only output.
	* Discard object-only section.
    * For each IR object file:
      * Add IR and non-IR sections to the regular output.
    * For each non-IR object file:
      * Add non-IR sections to the regular output.
      * Add non-IR sections to the object-only output.
    * Final output:
      * If there are IR objects, non-IR objects and the object-only
      output isn't empty:
	* Put the object-only output into the object-only section.
	* Add the object-only section to the regular output.
	* Remove the object-only output.
  o Normal link and relocatable IR link:
    * Prepare for output.
    * IR link:
      * For each mixed object file:
	* Compile and add IR sections to the output.
	* Discard non-IR sections.
	* Object-only section:
	  * Extract object only file.
	  * Add it to the output.
	  * Discard object-only section.
      * For each IR object file:
        * Compile and add IR sections to the output.
	* Discard non-IR sections.
      * For each non-IR object file:
	* Add non-IR sections to the output.
    * Non-IR link:
      * For each mixed object file:
	* Add non-IR sections to the output.
	* Discard IR sections and object-only section.
      * For each IR object file:
	* Add non-IR sections to the output.
	* Discard IR sections.
      * For each non-IR object file:
	* Add non-IR sections to the output.

This is useful for Linux kernel build with LTO.

bfd/

	PR ld/12291
	PR ld/12430
	PR ld/13298
	* bfd.c (bfd_lto_object_type): Add lto_mixed_object.
	(bfd): Add object_only_section.
	(bfd_group_signature): New.
	* elf.c (special_sections_g): Add .gnu_object_only.
	* format.c: Include "plugin-api.h" and "plugin.h" if
	BFD_SUPPORTS_PLUGINS is defined.
	(bfd_set_lto_type): Set type to lto_mixed_object for
	GNU_OBJECT_ONLY_SECTION_NAME section.
	(bfd_check_format_matches): Don't check the plugin target twice
	if the plugin target is explicitly specified.
	* opncls.c (bfd_extract_object_only_section): New.
	* plugin.c (bfd_plugin_fake_text_section): New.
	(bfd_plugin_fake_data_section): Likewise.
	(bfd_plugin_fake_bss_section): Likewise.
	(bfd_plugin_fake_common_section): Likewise.
	(bfd_plugin_get_symbols_in_object_only): Likewise.
	* plugin.c (add_symbols): Call
	bfd_plugin_get_symbols_in_object_only and count
	plugin_data->object_only_nsyms.
	(bfd_plugin_get_symtab_upper_bound): Count
	plugin_data->object_only_nsyms.
	bfd_plugin_get_symbols_in_object_only and add symbols from
	object only section.
	(bfd_plugin_canonicalize_symtab): Remove fake_section,
	fake_data_section, fake_bss_section and fake_common_section.
	Set udata.p to NULL.  Use bfd_plugin_fake_text_section,
	bfd_plugin_fake_data_section, bfd_plugin_fake_bss_section and
	bfd_plugin_fake_common_section.
	Set udata.p to NULL.
	* plugin.h (plugin_data_struct): Add object_only_nsyms and
	object_only_syms.
	* section.c (GNU_OBJECT_ONLY_SECTION_NAME): New.
	* bfd-in2.h: Regenerated.

binutils/

	PR ld/12291
	PR ld/12430
	PR ld/13298
	* objcopy.c (group_signature): Removed.
	(is_strip_section): Replace group_signature with
	bfd_group_signature.
	(setup_section): Likewise.
	* readelf.c (get_os_specific_section_type_name): Handle
	SHT_GNU_OBJECT_ONLY.

gas/

	PR ld/12291
	PR ld/12430
	PR ld/13298
	* testsuite/gas/elf/section9.s: Add the .gnu_object_only test.
	* testsuite/gas/elf/section9.d: Updated.

include/

	PR ld/12291
	PR ld/12430
	PR ld/13298
	* elf/common.h (SHT_GNU_OBJECT_ONLY): New.

ld/

	PR ld/12291
	PR ld/12430
	PR ld/13298
	* ld.h (ld_config_type): Add emit_gnu_object_only and
	emitting_gnu_object_only.
	* ldelf.c (orphan_init_done): Make it file scope.
	(ldelf_place_orphan): Rename hold to orig_hold.  Initialize hold
	from orig_hold at run-time.
	(ldelf_finish): New.
	* ldelf.h (ldelf_finish): New.
	* ldexp.c (ldexp_init): Take a bfd_boolean argument to supprt
	object-only output.
	(ldexp_finish): Likewise.
	* ldexp.h (ldexp_init): Take a bfd_boolean argument.
	(ldexp_finish): Likewise.
	* ldfile.c (ldfile_try_open_bfd): Call
	cmdline_check_object_only_section.
	* ldlang.c: Include "ldwrite.h" and elf-bfd.h.
	* ldlang.c (cmdline_object_only_file_list): New.
	(cmdline_object_only_archive_list): Likewise.
	(cmdline_temp_object_only_list): Likewise.
	(cmdline_lists_init): Likewise.
	(cmdline_list_new): Likewise.
	(cmdline_list_append): Likewise.
	(print_cmdline_list): Likewise.
	(cmdline_on_object_only_archive_list_p): Likewise.
	(cmdline_object_only_list_append): Likewise.
	(cmdline_get_object_only_input_files): Likewise.
	(cmdline_arg): Likewise.
	(setup_section): Likewise.
	(copy_section): Likewise.
	(cmdline_fopen_temp): Likewise.
	(cmdline_add_object_only_section): Likewise.
	(cmdline_emit_object_only_section): Likewise.
	(cmdline_extract_object_only_section): Likewise.
	(cmdline_check_object_only_section): Likewise.
	(cmdline_remove_object_only_files): Likewise.
	(lang_init): Take a bfd_boolean argument to supprt object-only
	output.  Call cmdline_lists_init.
	(load_symbols): Call cmdline_on_object_only_archive_list_p
	to check if an archive member should be loaded.
	(lang_process): Handle object-only link.
	* ldlang.h (lang_init): Take a bfd_boolean argument.
	(cmdline_enum_type): New.
	(cmdline_header_type): Likewise.
	(cmdline_file_type): Likewise.
	(cmdline_bfd_type): Likewise.
	(cmdline_union_type): Likewise.
	(cmdline_list_type): Likewise.
	(cmdline_emit_object_only_section): Likewise.
	(cmdline_check_object_only_section): Likewise.
	(cmdline_remove_object_only_files): Likewise.
	* ldmain.c (main): Call xatexit with
	cmdline_remove_object_only_files.  Pass FALSE to lang_init,
	ldexp_init and ldexp_finish.  Use ld_parse_linker_script.
	Set link_info.output_bfd to NULL after close.  Call
	cmdline_emit_object_only_section if needed.
	(add_archive_element): Call cmdline_check_object_only_section.
	(ld_parse_linker_script): New.
	* ldmain.h (ld_parse_linker_script): New.
	* plugin.c (plugin_maybe_claim): Call
	cmdline_check_object_only_section on claimed IR files.
	* scripttempl/elf.sc: Also discard .gnu_object_only sections.
	* scripttempl/elf64hppa.sc: Likewise.
	* scripttempl/elfxtensa.sc: Likewise.
	* scripttempl/mep.sc: Likewise.
	* scripttempl/pe.sc: Likewise.
	* scripttempl/pep.sc: Likewise.
	* emultempl/aarch64elf.em (gld${EMULATION_NAME}_finish): Replace
	finish_default with ldelf_finish.
	* emultempl/alphaelf.em (alpha_finish): Likewise.
	* emultempl/avrelf.em (avr_finish): Likewise.
	* emultempl/elf.em (ld_${EMULATION_NAME}_emulation): Likewise.
	* emultempl/ppc32elf.em (ppc_finish): Likewise.
	* emultempl/ppc64elf.em (gld${EMULATION_NAME}_finish): Likewise.
	* emultempl/spuelf.em (gld${EMULATION_NAME}_finish): Likewise.
	* testsuite/ld-plugin/lto-10.out: New file.
	* testsuite/ld-plugin/lto-10a.c: Likewise.
	* testsuite/ld-plugin/lto-10b.c: Likewise.
	* testsuite/ld-plugin/lto-10r.d: Likewise.
	* testsuite/ld-plugin/lto-4.out: Likewise.
	* testsuite/ld-plugin/lto-4a.c: Likewise.
	* testsuite/ld-plugin/lto-4b.c: Likewise.
	* testsuite/ld-plugin/lto-4c.c: Likewise.
	* testsuite/ld-plugin/lto-4r-a.d: Likewise.
	* testsuite/ld-plugin/lto-4r-b.d: Likewise.
	* testsuite/ld-plugin/lto-4r-c.d: Likewise.
	* testsuite/ld-plugin/lto-4r-d.d: Likewise.
	* testsuite/ld-plugin/lto.exp (lto_link_tests): Prepare for
	"LTO 4[acd]", "lto-4r-[abcd]" and "LTO 10" tests.
	(lto_run_tests): Add "LTO 4[acd]" and "LTO 10" tests.
	Build liblto-4.a.  Run "lto-4r-[abcd]" tests.
	Run lto-10r and create tmpdir/lto-10.o.
	Add test for nm on mixed LTO/non-LTO object.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2025-01-14 05:22:04 +08:00
Alan Modra
f832531609 ar and foreign object files
ar is supposed to make archives containing any sort of file, and it
generally does that.  It also tries to make archives suited to target
object files stored.  Some targets have peculiar archives.

In one particular case we get into trouble trying to suit archives to
object files: where the target object file is recognised but that
target doesn't happen to support archives, and the default target has
a special archive format.  For example, we'll get failures on
rs6000-aix if trying to add tekhex objects to a new archive.  What
happens in that the tekhex object is recognised and its target vector
used to create an empty archive, ie. with _bfd_generic_mkarchive and
_bfd_write_archive_contents.  An attempt is then made to open the
newly created archive.  The tekhex target vector does not have a
check_format function to recognise generic archives, nor as it happens
do any of the xcoff or other targets built for rs6000-aix.

It seems to me the simplest fix is to not use any target vector to
create archives where that vector can't also recognise them.  That's
what this patch does, and to reinforce that I've removed target vector
support for creating empty archives from such targets.

bfd/
	* i386msdos.c (i386_msdos_vec): Remove support for creating
	empty archives.
	* ihex.c (ihex_vec): Likewise.
	* srec.c (srec_vec, symbolsrec_vec): Likewise.
	* tekhex.c (tekhex_vec): Likewise.
	* wasm-module.c (wasm_vec): Likewise.
	* ptrace-core.c (core_ptrace_vec): Tidy.
	* targets.c (bfd_target_supports_archives): New inline function.
	* bfd-in2.h: Regenerate.
binutils/
	* ar.c (open_inarch): Don't select a target from the first
	object file that can't read archives.  Set output_filename
	earlier.
	* testsuite/binutils-all/ar.exp (thin_archive_with_nested):
	Don't repeat --thin test using T.
	(foreign_object): New test.
	* testsuite/binutils-all/tek1.obj,
	* testsuite/binutils-all/tek2.obj: New files.
2025-01-06 14:09:32 +10:30
Alan Modra
94e2b2a770 readelf memory leaks
This fixes multiple readelf memory leaks:
- The check functions used to validate separate debug info files
  opened and read file data but didn't release the memory nor close
  the file.
- A string table was being re-read into a buffer, leaking the old
  contents.
- Decompressed section contents leaked.

	* dwarf.c (check_gnu_debuglink): Always call close_debug_file.
	(check_gnu_debugaltlink): Likewise.
	* readelf.c (process_section_headers): Don't read string_table
	again if we already have it.
	(maybe_expand_or_relocate_section): Add decomp_buf param to
	return new uncompressed buffer.
	(dump_section_as_strings, filedata->string_table): Free any
	uncompressed buffer.
	(process_file): Call close_debug_file rather than freeing
	various filedata components.
2025-01-01 22:52:59 +10:30
Alan Modra
0e4e9aa0a7 objdump sym memory leak
The sym array should be freed even with a symcount of zero.

	* objdump.c (dump_bfd): Free syms before replacing with
	extra_syms.  Free extra_syms after adding to syms.
2025-01-01 22:52:51 +10:30
Alan Modra
4739b9137e Close elements of output archive
When cleaning up an archive, close all its elements.  This fixes a
number of ar memory leaks.

bfd/
	* archive.c (_bfd_archive_close_and_cleanup): Close elements
	of an archive open for writing.
binutils/
	* objcopy.c (copy_archive): Don't close output archive
	elements here.
	* dlltool.c (gen_lib_file): Likewise.
ld/
	* pe-dll.c (pe_dll_generate_implib): Don't close output
	archive elements here.
2025-01-01 22:52:06 +10:30
Alan Modra
d58fbef40d ar.c memory leak fixme
Cure the leak by always mallocing the string in output_filename,
and freeing the old one any time we assign output_filename.
2025-01-01 22:51:53 +10:30
Alan Modra
c5e10fb2eb bfdtest1 loop check
Add a check that next_archived_file doesn't return the same element.
Seen with the following, which I think shows a bug with "ar r" and
thin archives as you get two copies of artest.a in artest2.a.

$ rm tmpdir/artest*
$ ./ar rc tmpdir/artest.a tmpdir/bintest.o
$ ./ar rcT tmpdir/artest2.a tmpdir/artest.a
$ ./bfdtest1 tmpdir/artest.a
$ ./bfdtest1 tmpdir/artest2.a
$ ./ar rcT tmpdir/artest2.a tmpdir/artest.a
$ ./bfdtest1 tmpdir/artest2.a
oops: next_archived_file
2025-01-01 22:51:44 +10:30
Alan Modra
e8e7cf2abe Update year range in copyright notice of binutils files 2025-01-01 18:29:57 +10:30
Nick Clifton
c2d41e8a42 nm: Avoid potential segmentation fault when displaying symbols without version info.
PR 32467
2024-12-17 09:18:21 +00:00
Alexandra Hájková
d05b8f0180 display_lang: Add descriptions for post DWARF5 constants
Describe all the new post DWARF5 language codes from the latest sync
of include/dwarf.h with gcc.
2024-12-14 16:06:46 +01:00
Alan Modra
5ba2d7a0a3 Delete asection.symbol_ptr_ptr
This field is always set to point to asection.symbol, and no code ever
changes it from its initial value.  With one exception.  elfxx-mips.c
creates two sections with separate pointers to their symbols, and uses
those as asection.symbol_ptr_ptr.  Those pointers aren't modified,
so they disappear in this patch too.
2024-12-14 19:19:32 +10:30
Alan Modra
d2cca35960 objdump: Delete close optimisation
In commit cd6581da62, Nick made an optimisation that was reasonable
at the time, but then pr22032 came along and commit 7c0ed39626 made
bfd_close_all_done free memory.  So Nick's optimisation is now
ineffective, and the comment wrong.

	* objdump.c (display_file): Delete last_file param.  Update
	caller.  Call bfd_close always.
2024-12-13 13:56:15 +10:30
Alan Modra
4d72d10271 close last arfile before processing current arfile
This also reduces peak memory a little.

	* dlltool.c (identify_search_archive): Close last_arfile earlier.
	Report an error if bfd_openr_next_archived_file returns the same
	bfd.  Localise variables.
	* nm.c (display_archive): Likewise.
	* objdump.c (display_any_bfd): Likewise.
	* size.c (display_archive): Likewise.
2024-12-12 16:04:51 +10:30
Alan Modra
2b76d69e57 nm.c free_lineno_cache
free_lineno_cache frees symbol and relocation data used when displaying
line number info for symbols (nm -l).  Currently that is done when
closing the bfd, but that's not ideal for archives since that results
in two bfds worth of memory in use.

	* nm.c (display_rel_file): Call free_lineno_cache here..
	(display_archive, display_file): ..not here.
2024-12-12 16:04:51 +10:30