From: "Sam James" <sam@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/toolchain/binutils-patches:master commit in: 9999/
Date: Sat, 11 Oct 2025 00:46:52 +0000 (UTC) [thread overview]
Message-ID: <1760143608.56cd194bbf2a0a211d1818b4b42ab0c74893bb18.sam@gentoo> (raw)
commit: 56cd194bbf2a0a211d1818b4b42ab0c74893bb18
Author: Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Sat Oct 11 00:46:39 2025 +0000
Commit: Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Sat Oct 11 00:46:48 2025 +0000
URL: https://gitweb.gentoo.org/proj/toolchain/binutils-patches.git/commit/?id=56cd194b
9999: update patch from ML
Signed-off-by: Sam James <sam <AT> gentoo.org>
...-internal-symbol-table-in-relocatable-BFD.patch | 522 ++++++++++++---------
1 file changed, 309 insertions(+), 213 deletions(-)
diff --git a/9999/0005-elf-Cache-internal-symbol-table-in-relocatable-BFD.patch b/9999/0005-elf-Cache-internal-symbol-table-in-relocatable-BFD.patch
index acae3cf..f829ffc 100644
--- a/9999/0005-elf-Cache-internal-symbol-table-in-relocatable-BFD.patch
+++ b/9999/0005-elf-Cache-internal-symbol-table-in-relocatable-BFD.patch
@@ -1,25 +1,45 @@
-From 13058a8b8feb26ddafb62995f164d81dce02979c Mon Sep 17 00:00:00 2001
+From 6081e4356a0e4f9932a05af0871490fc54e15113 Mon Sep 17 00:00:00 2001
+Message-ID: <6081e4356a0e4f9932a05af0871490fc54e15113.1760143572.git.sam@gentoo.org>
From: "H.J. Lu" <hjl.tools@gmail.com>
-Date: Thu, 9 Oct 2025 13:16:19 +0800
+Date: Sat, 11 Oct 2025 07:18:50 +0800
Subject: [PATCH] elf: Cache full internal symbol table for relocatable input
-Cache internal symbol table for relocatable input and use the internal
-symbol table cache for both local and global symbols to avoid swapping in
-the same symbol table repeatedly for --gc-sections. This improves linker
---gc-sections speed by ~20x.
+Add bfd_elf_get_elf_syms_cached to cache internal symbol table for
+relocatable input and use the internal symbol table cache for both local
+and global symbols to avoid swapping in the same symbol table repeatedly
+for --gc-sections. This improves linker --gc-sections speed by ~2x for
+PR ld/33530.
-Most backends cache the local symbol table in symtab_hdr->contents. But
-some backends cache something else in it. Since symtab_hdr->contents may
-point to the middle of the internal symbol table cache, we can release
-symtab_hdr->contents only when no backends cache the local symbol table
-in it.
+elf_link_input_bfd is updated to not to pass preallocated buffers to
+bfd_elf_get_elf_syms_cache.
+
+Data to link the 3.1GB clang executable in LLVM 21 debug build on
+Linux/x86-64 with 32GB RAM is:
+
+ before after improvement
+user 48.29 46.45 3.8%
+system 7.82 5.47 30%
+total 56.1 51.92 7%
+maximum set(GB) 10.5 10.7 -0.2%
+page faults 2535779 2509896 0.1%
+
+and data to link the 308M cc1plus executable in GCC 16 stage 1 build is:
+
+ before after improvement
+user 3.56 3.49 0.2%
+system 0.66 0.58 12%
+total 4.22 4.07 0.3%
+maximum set(MB) 969 992 -2.4%
+page faults 992692 1016732 0.1%
bfd/
PR ld/33530
- * elf-bfd.h (elf_obj_tdata): Add symtab and keep_symtab.
+ * elf-bfd.h (elf_obj_tdata): Add symtab.
(bfd_elf_get_elf_syms): Remove the Elf_External_Sym_Shndx pointer
argument.
+ (bfd_elf_get_elf_syms_cached): New function.
+ (bfd_elf_free_symtab): Likewise.
* elf-eh-frame.c (adjust_eh_frame_local_symbols): Changed to
return void.
(_bfd_elf_discard_section_eh_frame): Updated. Don't cache
@@ -30,6 +50,15 @@ bfd/
* elf-m10300.c (mn10300_elf_check_relocs): Likewise.
(mn10300_elf_relax_section): Likewise.
(mn10300_elf_get_relocated_section_contents): Likewise.
+ * elf.c (bfd_elf_get_elf_syms): Drop the Elf_External_Sym_Shndx
+ pointer argument. Renamed to ...
+ (bfd_elf_get_elf_syms_cached): This. Cache internal symbol
+ table.
+ (bfd_elf_get_elf_syms): Call bfd_elf_get_elf_syms_cached.
+ (group_signature): Call bfd_elf_get_elf_syms_cached instead of
+ bfd_elf_get_elf_syms.
+ (bfd_sym_from_r_symndx): Likewise.
+ (_bfd_elf_free_cached_info): Free internal symbol table cache.
* elf32-arc.c (arc_elf_relax_section): Likewise.
* elf32-arm.c (cmse_scan): Likewise.
(elf32_arm_size_stubs): Likewise.
@@ -92,34 +121,25 @@ bfd/
(ppc64_elf_late_size_sections): Likewise.
(ppc64_elf_layout_multitoc): Likewise.
(got_and_plt_relr_for_local_syms): Likewise.
- * elfnn-aarch64.c (_bfd_aarch64_add_call_stub_entries): Likewise.
- (bfd_elfNN_aarch64_init_maps): Likewise.
- * elfnn-ia64.c (elfNN_ia64_relax_section): Likewise.
- * elfnn-kvx.c (elfNN_kvx_size_stubs): Likewise.
- * elfnn-loongarch.c (_bfd_riscv_relax_section): Likewise.
- * elfxx-mips.c (_bfd_mips_elf_relax_section): Likewise.
- * elf.c (bfd_elf_get_elf_syms): Drop the Elf_External_Sym_Shndx
- pointer argument. Only allow the full external symbol table.
- Cache internal symbol table.
- (group_signature): Update the bfd_elf_get_elf_syms call.
- (bfd_sym_from_r_symndx): Likewise.
- (_bfd_elf_free_cached_info): Free internal symbol table cache.
- * elfcode.h (elf_slurp_symbol_table): Don't free internal symbol
- buffer.
- * elflink.c (bfd_elf_link_record_local_dynamic_symbol): Update
- the bfd_elf_get_elf_syms call.
- (elf_link_is_defined_archive_symbol): Likewise. Free cached
- internal symbol buffer unless it should be kept.
- (elf_link_add_object_symbols): Update the bfd_elf_get_elf_syms
- call. Free cached internal symbol buffer.
- (bfd_elf_match_symbols_in_sections): Update the
- bfd_elf_get_elf_syms call. Don't free the internal symbol table.
+ * elfcode.h (elf_slurp_symbol_table): Call
+ bfd_elf_get_elf_syms_cached instead of bfd_elf_get_elf_syms.
+ Don't free internal symbol buffer.
+ * elflink.c (bfd_elf_link_record_local_dynamic_symbol): Call
+ bfd_elf_get_elf_syms_cached instead of bfd_elf_get_elf_syms.
+ (elf_link_is_defined_archive_symbol): Likewise. Free internal
+ symbol table cache.
+ (elf_link_add_object_symbols): Call bfd_elf_get_elf_syms_cached
+ instead of bfd_elf_get_elf_syms. Free internal symbol table
+ cache if it has been changed.
+ (bfd_elf_match_symbols_in_sections): Call
+ bfd_elf_get_elf_syms_cached instead of bfd_elf_get_elf_syms.
+ Don't free the internal symbol table.
(elf_final_link_info): Remove external_syms, locsym_shndx and
internal_syms.
- (elf_link_check_versioned_symbol): Update the bfd_elf_get_elf_syms
- call.
- (elf_link_input_bfd): Likewise. Don't use symtab_hdr->contents
- for internal symbol table.
+ (elf_link_check_versioned_symbol): Call
+ bfd_elf_get_elf_syms_cached instead of bfd_elf_get_elf_syms.
+ (elf_link_input_bfd): Likewise. Don't pass pre-allocated
+ buffer to bfd_elf_get_elf_syms_cached.
(elf_final_link_free): Updated.
(bfd_elf_final_link): Don't set flinfo.external_syms,
flinfo.internal_syms nor flinfo.locsym_shndx.
@@ -135,6 +155,12 @@ bfd/
(bfd_elf_discard_info): Replace fini_reloc_cookie_for_section with
fini_reloc_cookie_rels. Don't call fini_reloc_cookie.
(bfd_elf_parse_eh_frame_entries): Updated.
+ * elfnn-aarch64.c (_bfd_aarch64_add_call_stub_entries): Likewise.
+ (bfd_elfNN_aarch64_init_maps): Likewise.
+ * elfnn-ia64.c (elfNN_ia64_relax_section): Likewise.
+ * elfnn-kvx.c (elfNN_kvx_size_stubs): Likewise.
+ * elfnn-loongarch.c (_bfd_riscv_relax_section): Likewise.
+ * elfxx-mips.c (_bfd_mips_elf_relax_section): Likewise.
* elfxx-x86.c (_bfd_x86_elf_link_relax_section): Don't use
use symtab_hdr->contents for internal symbol table. Set
keep_symtab if the symbol table has been updated.
@@ -142,19 +168,20 @@ bfd/
libctf/
PR ld/33530
- * ctf-open-bfd.c (ctf_bfdopen_ctfsect): Free internal symbol
- table cache.
+ * ctf-open-bfd.c (ctf_bfdopen_ctfsect): Call
+ bfd_elf_get_elf_syms_cached instead of bfd_elf_get_elf_syms.
+ Free internal symbol table cache.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
---
- bfd/elf-bfd.h | 11 ++-
- bfd/elf-eh-frame.c | 17 ++---
+ bfd/elf-bfd.h | 19 ++++-
+ bfd/elf-eh-frame.c | 17 +----
bfd/elf-m10200.c | 4 +-
bfd/elf-m10300.c | 10 +--
- bfd/elf.c | 131 ++++++++++++++++++++++++++---------
+ bfd/elf.c | 167 +++++++++++++++++++++++++++++++----------
bfd/elf32-arc.c | 2 +-
bfd/elf32-arm.c | 7 +-
- bfd/elf32-avr.c | 12 ++--
+ bfd/elf32-avr.c | 12 +--
bfd/elf32-bfin.c | 2 +-
bfd/elf32-cr16.c | 6 +-
bfd/elf32-crx.c | 4 +-
@@ -164,7 +191,7 @@ Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
bfd/elf32-h8300.c | 4 +-
bfd/elf32-hppa.c | 2 +-
bfd/elf32-ip2k.c | 2 +-
- bfd/elf32-m32c.c | 8 ++-
+ bfd/elf32-m32c.c | 8 +-
bfd/elf32-m68hc11.c | 2 +-
bfd/elf32-m68hc1x.c | 2 +-
bfd/elf32-m68k.c | 2 +-
@@ -185,21 +212,21 @@ Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
bfd/elf64-hppa.c | 2 +-
bfd/elf64-ia64-vms.c | 4 +-
bfd/elf64-mmix.c | 2 +-
- bfd/elf64-ppc.c | 12 ++--
- bfd/elfcode.h | 8 +--
- bfd/elflink.c | 152 ++++++++++++-----------------------------
+ bfd/elf64-ppc.c | 12 +--
+ bfd/elfcode.h | 10 +--
+ bfd/elflink.c | 162 +++++++++++----------------------------
bfd/elfnn-aarch64.c | 4 +-
bfd/elfnn-ia64.c | 2 +-
bfd/elfnn-kvx.c | 2 +-
bfd/elfnn-loongarch.c | 2 +-
bfd/elfnn-riscv.c | 2 +-
bfd/elfxx-mips.c | 2 +-
- bfd/elfxx-x86.c | 24 +++----
- libctf/ctf-open-bfd.c | 5 +-
- 49 files changed, 243 insertions(+), 262 deletions(-)
+ bfd/elfxx-x86.c | 22 ++++--
+ libctf/ctf-open-bfd.c | 6 +-
+ 49 files changed, 293 insertions(+), 267 deletions(-)
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
-index 5d19529d972..b7061e55b59 100644
+index 5d19529d972..b0bd8f4d589 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2165,6 +2165,11 @@ struct elf_obj_tdata
@@ -214,26 +241,34 @@ index 5d19529d972..b7061e55b59 100644
/* List of GNU properties. Will be updated by setup_gnu_properties
after all input GNU properties are merged for output. */
elf_property_list *properties;
-@@ -2207,6 +2212,9 @@ struct elf_obj_tdata
- symbols. */
- unsigned int bad_symtab : 1;
-
-+ /* Set if the symbol table cache should be kept. */
-+ unsigned int keep_symtab : 1;
-+
- /* Set if DT_FLAGS_1 has DF_1_PIE set. */
- unsigned int is_pie : 1;
-
-@@ -2297,8 +2305,7 @@ extern unsigned int _bfd_elf_section_from_bfd_section
+@@ -2297,8 +2302,9 @@ extern unsigned int _bfd_elf_section_from_bfd_section
extern char *bfd_elf_string_from_elf_section
(bfd *, unsigned, unsigned);
extern Elf_Internal_Sym *bfd_elf_get_elf_syms
- (bfd *, Elf_Internal_Shdr *, size_t, size_t, Elf_Internal_Sym *, void *,
- Elf_External_Sym_Shndx *);
++ (bfd *, Elf_Internal_Shdr *, size_t, size_t, Elf_Internal_Sym *, void *);
++extern Elf_Internal_Sym *bfd_elf_get_elf_syms_cached
+ (bfd *, Elf_Internal_Shdr *, size_t, size_t, Elf_Internal_Sym *, void *);
extern char * bfd_elf_get_str_section (bfd *, unsigned int);
extern const char *bfd_elf_sym_name
(bfd *, Elf_Internal_Shdr *, Elf_Internal_Sym *, asection *);
+@@ -3333,6 +3339,15 @@ bfd_section_is_ctf (const asection *sec)
+ return startswith (name, ".ctf") && (name[4] == 0 || name[4] == '.');
+ }
+
++/* Free ELF symbol table cache. */
++
++static inline void
++bfd_elf_free_symtab (bfd *abfd)
++{
++ free (elf_tdata (abfd)->symtab);
++ elf_tdata (abfd)->symtab = NULL;
++}
++
+ #ifdef __cplusplus
+ }
+ #endif
diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
index 4eda3c991bb..bd2c85291fb 100644
--- a/bfd/elf-eh-frame.c
@@ -353,7 +388,7 @@ index b381bb9037c..373290cbe4a 100644
goto error_return;
}
diff --git a/bfd/elf.c b/bfd/elf.c
-index bde7414ee21..9e220f0a0d7 100644
+index bde7414ee21..472fb5da55e 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -428,21 +428,20 @@ bfd_elf_string_from_elf_section (bfd *abfd,
@@ -369,20 +404,23 @@ index bde7414ee21..9e220f0a0d7 100644
- Returns a pointer to the internal symbol buffer (malloced if necessary)
- or NULL if there were no symbols or some kind of problem. */
+ symbols, and symbol section index extensions, respectively. Returns
-+ a pointer to the internal symbol buffer (malloced if necessary) or
-+ NULL if there were no symbols or some kind of problem. */
++ a pointer to the internal symbol cache or NULL if there were no
++ symbols or some kind of problem. */
Elf_Internal_Sym *
- bfd_elf_get_elf_syms (bfd *ibfd,
- Elf_Internal_Shdr *symtab_hdr,
+-bfd_elf_get_elf_syms (bfd *ibfd,
+- Elf_Internal_Shdr *symtab_hdr,
- size_t symcount,
- size_t symoffset,
-+ size_t partial_symcount,
-+ size_t partial_symoffset,
- Elf_Internal_Sym *intsym_buf,
+- Elf_Internal_Sym *intsym_buf,
- void *extsym_buf,
- Elf_External_Sym_Shndx *extshndx_buf)
-+ void *partial_extsym_buf)
++bfd_elf_get_elf_syms_cached (bfd *ibfd,
++ Elf_Internal_Shdr *symtab_hdr,
++ size_t partial_symcount,
++ size_t partial_symoffset,
++ Elf_Internal_Sym *intsym_buf,
++ void *partial_extsym_buf)
{
Elf_Internal_Shdr *shndx_hdr;
void *alloc_ext;
@@ -400,30 +438,33 @@ index bde7414ee21..9e220f0a0d7 100644
if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
abort ();
-@@ -474,6 +478,22 @@ bfd_elf_get_elf_syms (bfd *ibfd,
+@@ -474,6 +478,25 @@ bfd_elf_get_elf_syms (bfd *ibfd,
return elf_tdata (ibfd)->dt_symtab + symoffset;
}
+ if (elf_tdata (ibfd)->symtab != NULL)
+ {
-+ /* NB: Should extsym_buf be cached? */
++ /* Since extsym_buf isn't cached, free the symbol table cache and
++ re-read the symbol table. */
+ if (partial_extsym_buf != NULL)
-+ abort ();
-+
-+ if (intsym_buf != NULL)
++ bfd_elf_free_symtab (ibfd);
++ else
+ {
-+ memcpy (intsym_buf, elf_tdata (ibfd)->symtab + symoffset,
-+ symcount * sizeof (*intsym_buf));
-+ return intsym_buf;
++ if (intsym_buf != NULL)
++ {
++ memcpy (intsym_buf, elf_tdata (ibfd)->symtab + symoffset,
++ symcount * sizeof (*intsym_buf));
++ return intsym_buf;
++ }
++ else
++ return elf_tdata (ibfd)->symtab + symoffset;
+ }
-+ else
-+ return elf_tdata (ibfd)->symtab + symoffset;
+ }
+
/* Normal syms might have section extension entries. */
shndx_hdr = NULL;
if (elf_symtab_shndx_list (ibfd) != NULL)
-@@ -506,19 +526,31 @@ bfd_elf_get_elf_syms (bfd *ibfd,
+@@ -506,19 +529,31 @@ bfd_elf_get_elf_syms (bfd *ibfd,
}
}
@@ -458,7 +499,7 @@ index bde7414ee21..9e220f0a0d7 100644
if (bfd_seek (ibfd, pos, SEEK_SET) != 0
|| !_bfd_mmap_read_temporary (&extsym_buf, &alloc_ext_size,
&alloc_ext, ibfd, false))
-@@ -551,22 +583,24 @@ bfd_elf_get_elf_syms (bfd *ibfd,
+@@ -551,22 +586,24 @@ bfd_elf_get_elf_syms (bfd *ibfd,
}
}
@@ -476,17 +517,17 @@ index bde7414ee21..9e220f0a0d7 100644
- goto out1;
+ bfd_set_error (bfd_error_file_too_big);
+ goto out1;
- }
++ }
+ alloc_intsym = (Elf_Internal_Sym *) bfd_malloc (amt);
+ if (alloc_intsym == NULL)
+ {
+ intsym_buf = NULL;
+ goto out1;
-+ }
-+
+ }
+
+ if (intsym_buf == NULL)
+ intsym_buf = alloc_intsym;
-
++
/* Convert the symbols to internal form. */
- isymend = intsym_buf + symcount;
- for (esym = (const bfd_byte *) extsym_buf, isym = intsym_buf,
@@ -495,7 +536,7 @@ index bde7414ee21..9e220f0a0d7 100644
shndx = extshndx_buf;
isym < isymend;
esym += extsym_size, isym++, shndx = shndx != NULL ? shndx + 1 : NULL)
-@@ -590,7 +624,9 @@ bfd_elf_get_elf_syms (bfd *ibfd,
+@@ -590,7 +627,9 @@ bfd_elf_get_elf_syms (bfd *ibfd,
{
/* xgettext:c-format */
_bfd_error_handler (_("%pB symbol number %lu uses unsupported binding of %u"),
@@ -506,7 +547,7 @@ index bde7414ee21..9e220f0a0d7 100644
free (alloc_intsym);
intsym_buf = NULL;
goto out1;
-@@ -602,19 +638,42 @@ bfd_elf_get_elf_syms (bfd *ibfd,
+@@ -602,18 +641,72 @@ bfd_elf_get_elf_syms (bfd *ibfd,
{
/* xgettext:c-format */
_bfd_error_handler (_("%pB symbol number %lu uses unsupported type of %u"),
@@ -520,23 +561,19 @@ index bde7414ee21..9e220f0a0d7 100644
}
}
++ /* Copy external symbol table before external symbol table buffer
++ is released by _bfd_munmap_temporary. */
+ if (intsym_buf != NULL && partial_extsym_buf != NULL)
-+ {
-+ if (partial_symcount != symcount)
-+ abort ();
-+ memcpy (partial_extsym_buf, extsym_buf, extsym_buf_size);
-+ }
++ memcpy (partial_extsym_buf,
++ extsym_buf + partial_symoffset * extsym_size,
++ partial_symcount * extsym_size);
+
out1:
_bfd_munmap_temporary (alloc_extshndx, alloc_extshndx_size);
out2:
_bfd_munmap_temporary (alloc_ext, alloc_ext_size);
-- return intsym_buf;
-+ if (intsym_buf == NULL)
-+ return intsym_buf;
-+
-+ if (!cache_symtab)
++ if (intsym_buf == NULL || !cache_symtab)
+ return intsym_buf;
+
+ elf_tdata (ibfd)->symtab = alloc_intsym;
@@ -548,10 +585,43 @@ index bde7414ee21..9e220f0a0d7 100644
+ }
+ else
+ return alloc_intsym + partial_symoffset;
++}
++
++/* Read and convert symbols to internal format.
++ PARTIAL_SYMCOUNT specifies the number of symbols to read, starting
++ from symbol PARTIAL_SYMOFFSET. If INTSYM_BUF or PARTIAL_EXTSYM_BUF
++ are non-NULL, they are used to store the internal symbols, external
++ symbols, and symbol section index extensions, respectively. Returns
++ a pointer to the internal symbol buffer (malloced if necessary) or
++ NULL if there were no symbols or some kind of problem. */
++
++Elf_Internal_Sym *
++bfd_elf_get_elf_syms (bfd *ibfd,
++ Elf_Internal_Shdr *symtab_hdr,
++ size_t partial_symcount,
++ size_t partial_symoffset,
++ Elf_Internal_Sym *intsym_buf,
++ void *partial_extsym_buf)
++{
++ Elf_Internal_Sym *isym
++ = bfd_elf_get_elf_syms_cached (ibfd, symtab_hdr, partial_symcount,
++ partial_symoffset, intsym_buf,
++ partial_extsym_buf);
++ if (isym == NULL
++ || intsym_buf != NULL
++ || partial_symcount == 0
++ || elf_use_dt_symtab_p (ibfd))
++ return isym;
++
++ size_t amt = partial_symcount * sizeof (*intsym_buf);
++ intsym_buf = bfd_malloc (amt);
++ if (intsym_buf != NULL)
++ memcpy (intsym_buf, isym, amt);
++ bfd_elf_free_symtab (ibfd);
+ return intsym_buf;
}
- /* Look up a symbol name. */
-@@ -659,8 +718,6 @@ static const char *
+@@ -659,8 +752,6 @@ static const char *
group_signature (bfd *abfd, Elf_Internal_Shdr *ghdr)
{
Elf_Internal_Shdr *hdr;
@@ -560,16 +630,18 @@ index bde7414ee21..9e220f0a0d7 100644
Elf_Internal_Sym isym;
/* First we need to ensure the symbol table is available. Make sure
-@@ -675,7 +732,7 @@ group_signature (bfd *abfd, Elf_Internal_Shdr *ghdr)
+@@ -674,8 +765,8 @@ group_signature (bfd *abfd, Elf_Internal_Shdr *ghdr)
+
/* Go read the symbol. */
hdr = &elf_tdata (abfd)->symtab_hdr;
- if (bfd_elf_get_elf_syms (abfd, hdr, 1, ghdr->sh_info,
+- if (bfd_elf_get_elf_syms (abfd, hdr, 1, ghdr->sh_info,
- &isym, esym, &eshndx) == NULL)
-+ &isym, NULL) == NULL)
++ if (bfd_elf_get_elf_syms_cached (abfd, hdr, 1, ghdr->sh_info,
++ &isym, NULL) == NULL)
return NULL;
return bfd_elf_sym_name_raw (abfd, hdr, &isym);
-@@ -3029,12 +3086,10 @@ bfd_sym_from_r_symndx (struct sym_cache *cache,
+@@ -3029,12 +3120,10 @@ bfd_sym_from_r_symndx (struct sym_cache *cache,
if (cache->abfd != abfd || cache->indx[ent] != r_symndx)
{
Elf_Internal_Shdr *symtab_hdr;
@@ -577,24 +649,17 @@ index bde7414ee21..9e220f0a0d7 100644
- Elf_External_Sym_Shndx eshndx;
symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
- if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
+- if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
- &cache->sym[ent], esym, &eshndx) == NULL)
-+ &cache->sym[ent], NULL) == NULL)
++ if (bfd_elf_get_elf_syms_cached (abfd, symtab_hdr, 1, r_symndx,
++ &cache->sym[ent], NULL) == NULL)
return NULL;
if (cache->abfd != abfd)
-@@ -10239,8 +10294,16 @@ _bfd_elf_free_cached_info (bfd *abfd)
- free (sec_info->cies);
- }
+@@ -10241,6 +10330,8 @@ _bfd_elf_free_cached_info (bfd *abfd)
}
-+#if 0
-+ /* NB: tdata->symtab_hdr.contents may point to the middle of
-+ tdata->symtab. Need to update all backends only to cache
-+ the malloced memory in tdata->symtab_hdr.contents before
-+ tdata->symtab_hdr.contents can be freed. */
free (tdata->symtab_hdr.contents);
tdata->symtab_hdr.contents = NULL;
-+#endif
+ free (tdata->symtab);
+ tdata->symtab = NULL;
}
@@ -1307,15 +1372,17 @@ index fdda9e0bbb3..ee15d6f0639 100644
return false;
}
diff --git a/bfd/elfcode.h b/bfd/elfcode.h
-index 5224a1abee6..8777a08a77a 100644
+index 5224a1abee6..f8176294bc9 100644
--- a/bfd/elfcode.h
+++ b/bfd/elfcode.h
-@@ -1303,7 +1303,7 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic)
+@@ -1302,8 +1302,8 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic)
+ {
size_t i;
- isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
+- isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
- NULL, NULL, NULL);
-+ NULL, NULL);
++ isymbuf = bfd_elf_get_elf_syms_cached (abfd, hdr, symcount, 0,
++ NULL, NULL);
if (isymbuf == NULL)
return -1;
@@ -1337,7 +1404,7 @@ index 5224a1abee6..8777a08a77a 100644
}
diff --git a/bfd/elflink.c b/bfd/elflink.c
-index 3f3ea2cce51..da4da5c453a 100644
+index 3f3ea2cce51..0ab843a4924 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -851,8 +851,6 @@ bfd_elf_link_record_local_dynamic_symbol (struct bfd_link_info *info,
@@ -1349,89 +1416,119 @@ index 3f3ea2cce51..da4da5c453a 100644
if (! is_elf_hash_table (info->hash))
return 0;
-@@ -869,7 +867,7 @@ bfd_elf_link_record_local_dynamic_symbol (struct bfd_link_info *info,
+@@ -868,8 +866,9 @@ bfd_elf_link_record_local_dynamic_symbol (struct bfd_link_info *info,
+ return 0;
/* Go find the symbol, so that we can find it's name. */
- if (!bfd_elf_get_elf_syms (input_bfd, &elf_tdata (input_bfd)->symtab_hdr,
+- if (!bfd_elf_get_elf_syms (input_bfd, &elf_tdata (input_bfd)->symtab_hdr,
- 1, input_indx, &entry->isym, esym, &eshndx))
-+ 1, input_indx, &entry->isym, NULL))
++ if (!bfd_elf_get_elf_syms_cached (input_bfd,
++ &elf_tdata (input_bfd)->symtab_hdr,
++ 1, input_indx, &entry->isym, NULL))
{
bfd_release (input_bfd, entry);
return 0;
-@@ -3745,7 +3743,7 @@ elf_link_is_defined_archive_symbol (bfd * abfd, carsym * symdef)
+@@ -3744,8 +3743,8 @@ elf_link_is_defined_archive_symbol (bfd * abfd, carsym * symdef)
+ return false;
/* Read in the symbol table. */
- isymbuf = bfd_elf_get_elf_syms (abfd, hdr, extsymcount, extsymoff,
+- isymbuf = bfd_elf_get_elf_syms (abfd, hdr, extsymcount, extsymoff,
- NULL, NULL, NULL);
-+ NULL, NULL);
++ isymbuf = bfd_elf_get_elf_syms_cached (abfd, hdr, extsymcount,
++ extsymoff, NULL, NULL);
if (isymbuf == NULL)
return false;
-@@ -3767,7 +3765,11 @@ elf_link_is_defined_archive_symbol (bfd * abfd, carsym * symdef)
+@@ -3767,7 +3766,7 @@ elf_link_is_defined_archive_symbol (bfd * abfd, carsym * symdef)
}
}
- free (isymbuf);
-+ if (!elf_tdata (abfd)->keep_symtab)
-+ {
-+ free (elf_tdata (abfd)->symtab);
-+ elf_tdata (abfd)->symtab = NULL;
-+ }
++ bfd_elf_free_symtab (abfd);
return result;
}
-@@ -4830,7 +4832,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
+@@ -4829,8 +4828,8 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
+ sym_hash = elf_sym_hashes (abfd);
if (extsymcount != 0)
{
- isymbuf = bfd_elf_get_elf_syms (abfd, hdr, extsymcount, extsymoff,
+- isymbuf = bfd_elf_get_elf_syms (abfd, hdr, extsymcount, extsymoff,
- NULL, NULL, NULL);
-+ NULL, NULL);
++ isymbuf = bfd_elf_get_elf_syms_cached (abfd, hdr, extsymcount,
++ extsymoff, NULL, NULL);
if (isymbuf == NULL)
goto error_return;
-@@ -5814,8 +5816,11 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
+@@ -4977,6 +4976,8 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
+ (_("%pB: plugin needed to handle lto object"), abfd);
+ }
+
++ bool symtab_changed = false;
++
+ for (isym = isymbuf, isymend = PTR_ADD (isymbuf, extsymcount);
+ isym < isymend;
+ isym++, sym_hash++, ever = (ever != NULL ? ever + 1 : NULL))
+@@ -5013,6 +5014,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
+ {
+ /* Treat common symbol as undefined for --no-define-common. */
+ isym->st_shndx = SHN_UNDEF;
++ symtab_changed = true;
+ common = false;
+ }
+ discarded = false;
+@@ -5086,6 +5088,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
+ sec = bfd_und_section_ptr;
+ discarded = true;
+ isym->st_shndx = SHN_UNDEF;
++ symtab_changed = true;
+ }
+ else if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
+ value -= sec->vma;
+@@ -5814,8 +5817,10 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
free (extversym);
extversym = NULL;
- free (isymbuf);
- isymbuf = NULL;
+
-+ /* NB: Since st_shndx of symbol from discarded section is changed to
-+ SHN_UNDEF, free the cached symbol table. */
-+ free (elf_tdata (abfd)->symtab);
-+ elf_tdata (abfd)->symtab = NULL;
++ /* Free internal symbol table cache if it has been changed. */
++ if (symtab_changed)
++ bfd_elf_free_symtab (abfd);
if ((elf_dyn_lib_class (abfd) & DYN_AS_NEEDED) != 0)
{
-@@ -6167,7 +6172,8 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
+@@ -6167,7 +6172,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
free (nondeflt_vers);
free (extversym);
error_free_sym:
- free (isymbuf);
-+ free (elf_tdata (abfd)->symtab);
-+ elf_tdata (abfd)->symtab = NULL;
++ bfd_elf_free_symtab (abfd);
error_return:
return false;
}
-@@ -8809,7 +8815,7 @@ bfd_elf_match_symbols_in_sections (asection *sec1, asection *sec2,
+@@ -8808,8 +8813,8 @@ bfd_elf_match_symbols_in_sections (asection *sec1, asection *sec2,
+
if (ssymbuf1 == NULL)
{
- isymbuf1 = bfd_elf_get_elf_syms (bfd1, hdr1, symcount1, 0,
+- isymbuf1 = bfd_elf_get_elf_syms (bfd1, hdr1, symcount1, 0,
- NULL, NULL, NULL);
-+ NULL, NULL);
++ isymbuf1 = bfd_elf_get_elf_syms_cached (bfd1, hdr1, symcount1,
++ 0, NULL, NULL);
if (isymbuf1 == NULL)
goto done;
-@@ -8823,7 +8829,7 @@ bfd_elf_match_symbols_in_sections (asection *sec1, asection *sec2,
+@@ -8822,8 +8827,8 @@ bfd_elf_match_symbols_in_sections (asection *sec1, asection *sec2,
+
if (ssymbuf1 == NULL || ssymbuf2 == NULL)
{
- isymbuf2 = bfd_elf_get_elf_syms (bfd2, hdr2, symcount2, 0,
+- isymbuf2 = bfd_elf_get_elf_syms (bfd2, hdr2, symcount2, 0,
- NULL, NULL, NULL);
-+ NULL, NULL);
++ isymbuf2 = bfd_elf_get_elf_syms_cached (bfd2, hdr2, symcount2,
++ 0, NULL, NULL);
if (isymbuf2 == NULL)
goto done;
-@@ -9013,8 +9019,6 @@ bfd_elf_match_symbols_in_sections (asection *sec1, asection *sec2,
+@@ -9013,8 +9018,6 @@ bfd_elf_match_symbols_in_sections (asection *sec1, asection *sec2,
done:
free (symtable1);
free (symtable2);
@@ -1440,7 +1537,7 @@ index 3f3ea2cce51..da4da5c453a 100644
return result;
}
-@@ -9056,14 +9060,6 @@ struct elf_final_link_info
+@@ -9056,14 +9059,6 @@ struct elf_final_link_info
void *external_relocs;
/* Buffer large enough to hold internal relocs of any section. */
Elf_Internal_Rela *internal_relocs;
@@ -1455,16 +1552,18 @@ index 3f3ea2cce51..da4da5c453a 100644
/* Array large enough to hold a symbol index for each local symbol
of any input BFD. */
long *indices;
-@@ -10666,7 +10662,7 @@ elf_link_check_versioned_symbol (struct bfd_link_info *info,
+@@ -10665,8 +10660,8 @@ elf_link_check_versioned_symbol (struct bfd_link_info *info,
+ if (extsymcount == 0)
continue;
- isymbuf = bfd_elf_get_elf_syms (input, hdr, extsymcount, extsymoff,
+- isymbuf = bfd_elf_get_elf_syms (input, hdr, extsymcount, extsymoff,
- NULL, NULL, NULL);
-+ NULL, NULL);
++ isymbuf = bfd_elf_get_elf_syms_cached (input, hdr, extsymcount,
++ extsymoff, NULL, NULL);
if (isymbuf == NULL)
return false;
-@@ -11410,7 +11406,7 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd)
+@@ -11410,7 +11405,7 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd)
Elf_Internal_Shdr *symtab_hdr;
size_t locsymcount;
size_t extsymoff;
@@ -1473,19 +1572,16 @@ index 3f3ea2cce51..da4da5c453a 100644
Elf_Internal_Sym *isym;
Elf_Internal_Sym *isymend;
long *pindex;
-@@ -11456,13 +11452,10 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd)
- ? -1 : ~elf_gnu_osabi_retain));
-
- /* Read the local symbols. */
-- isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
-- if (isymbuf == NULL && locsymcount != 0)
-+ if (locsymcount != 0)
+@@ -11459,10 +11454,8 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd)
+ isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
+ if (isymbuf == NULL && locsymcount != 0)
{
- isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, locsymcount, 0,
+- isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, locsymcount, 0,
- flinfo->internal_syms,
- flinfo->external_syms,
- flinfo->locsym_shndx);
-+ NULL, NULL);
++ isymbuf = bfd_elf_get_elf_syms_cached (input_bfd, symtab_hdr,
++ locsymcount, 0, NULL, NULL);
if (isymbuf == NULL)
return false;
}
@@ -1576,10 +1672,12 @@ index 3f3ea2cce51..da4da5c453a 100644
- if (cookie->locsyms == NULL && cookie->locsymcount != 0)
+ if (cookie->locsymcount != 0)
{
- cookie->locsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr,
- cookie->locsymcount, 0,
+- cookie->locsyms = bfd_elf_get_elf_syms (abfd, symtab_hdr,
+- cookie->locsymcount, 0,
- NULL, NULL, NULL);
-+ NULL, NULL);
++ cookie->locsyms = bfd_elf_get_elf_syms_cached (abfd, symtab_hdr,
++ cookie->locsymcount,
++ 0, NULL, NULL);
if (cookie->locsyms == NULL)
{
info->callbacks->einfo (_("%P%X: can not read symbols: %E\n"));
@@ -1678,21 +1776,17 @@ index 3f3ea2cce51..da4da5c453a 100644
sec = bfd_get_next_section_by_name (NULL, sec);
}
}
-@@ -14784,6 +14711,13 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
+@@ -14784,6 +14711,9 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
return false;
}
+
-+ if (!elf_tdata (sub)->keep_symtab
-+ && !_bfd_elf_link_keep_memory (info))
-+ {
-+ free (elf_tdata (sub)->symtab);
-+ elf_tdata (sub)->symtab = NULL;
-+ }
++ if (!_bfd_elf_link_keep_memory (info))
++ bfd_elf_free_symtab (sub);
}
/* Allow the backend to mark additional target specific sections. */
-@@ -15239,7 +15173,7 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
+@@ -15239,7 +15169,7 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
&cookie))
changed = 1;
@@ -1701,7 +1795,7 @@ index 3f3ea2cce51..da4da5c453a 100644
}
}
-@@ -15274,7 +15208,7 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
+@@ -15274,7 +15204,7 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
changed = 1;
}
@@ -1710,7 +1804,7 @@ index 3f3ea2cce51..da4da5c453a 100644
}
eh_alignment = ((1 << o->alignment_power)
-@@ -15339,7 +15273,7 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
+@@ -15339,7 +15269,7 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
changed = 1;
}
}
@@ -1719,7 +1813,7 @@ index 3f3ea2cce51..da4da5c453a 100644
}
/* Update the reference to the output .sframe section. Used to
determine later if PT_GNU_SFRAME segment is to be generated. */
-@@ -15362,13 +15296,11 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
+@@ -15362,13 +15292,11 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
if (bed->elf_backend_discard_info != NULL)
{
@@ -1822,64 +1916,66 @@ index 00ef0663728..44c58362dda 100644
goto error_return;
}
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
-index 140e86888a6..53083e0b54c 100644
+index 140e86888a6..3f397f5cf70 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
-@@ -1154,15 +1154,11 @@ _bfd_x86_elf_link_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
- /* Read this BFD's local symbols. */
- if (isymbuf == NULL)
- {
-- isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
-+ isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
-+ symtab_hdr->sh_info,
-+ 0, NULL, NULL);
+@@ -1157,9 +1157,10 @@ _bfd_x86_elf_link_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
+ isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
if (isymbuf == NULL)
-- {
+ {
- isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
- symtab_hdr->sh_info,
- 0, NULL, NULL, NULL);
-- if (isymbuf == NULL)
-- goto error_return;
-- }
-+ goto error_return;
- }
-
- isym = isymbuf + r_symndx;
-@@ -1345,14 +1341,10 @@ _bfd_x86_elf_link_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
++ isymbuf
++ = bfd_elf_get_elf_syms_cached (abfd, symtab_hdr,
++ symtab_hdr->sh_info,
++ 0, NULL, NULL);
+ if (isymbuf == NULL)
+ goto error_return;
+ }
+@@ -1345,13 +1346,18 @@ _bfd_x86_elf_link_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
return_status = true;
error_return:
- if ((unsigned char *) isymbuf != symtab_hdr->contents)
-- {
++ if (keep_symbuf && (unsigned char *) isymbuf != symtab_hdr->contents)
+ {
- /* Cache the symbol buffer if it must be kept. */
- if (keep_symbuf)
- symtab_hdr->contents = (unsigned char *) isymbuf;
-- else
++ /* Cache the symbol buffer if it has been changed. */
++ size_t amt = symtab_hdr->sh_info * sizeof (*isymbuf);
++ void *buffer = bfd_malloc (amt);
++ if (buffer == NULL)
++ return_status = false;
+ else
- free (isymbuf);
-- }
-+ /* If the symbol table has been updated, it must be kept since it will
-+ be used later. */
-+ if (keep_symbuf)
-+ elf_tdata (abfd)->keep_symtab = 1;
++ {
++ memcpy (buffer, isymbuf, amt);
++ symtab_hdr->contents = buffer;
++ }
+ }
if (elf_section_data (input_section)->relocs != internal_relocs)
free (internal_relocs);
- return return_status;
diff --git a/libctf/ctf-open-bfd.c b/libctf/ctf-open-bfd.c
-index 7241de70709..205347c4e22 100644
+index 7241de70709..2ec91ffb0bf 100644
--- a/libctf/ctf-open-bfd.c
+++ b/libctf/ctf-open-bfd.c
-@@ -146,8 +146,9 @@ ctf_bfdopen_ctfsect (struct bfd *abfd _libctf_unused_,
+@@ -145,9 +145,9 @@ ctf_bfdopen_ctfsect (struct bfd *abfd _libctf_unused_,
+ goto err;
}
- isymbuf = bfd_elf_get_elf_syms (abfd, symhdr, symcount, 0,
+- isymbuf = bfd_elf_get_elf_syms (abfd, symhdr, symcount, 0,
- NULL, symtab, NULL);
- free (isymbuf);
-+ NULL, symtab);
-+ free (elf_tdata (abfd)->symtab);
-+ elf_tdata (abfd)->symtab = NULL;
++ isymbuf = bfd_elf_get_elf_syms_cached (abfd, symhdr, symcount, 0,
++ NULL, symtab);
++ bfd_elf_free_symtab (abfd);
if (isymbuf == NULL)
{
bfderrstr = N_("cannot read symbol table");
+
+base-commit: 552ddbabb5d28b301c660ddeecae19510ed4aa30
--
-GitLab
+2.51.0
next reply other threads:[~2025-10-11 0:46 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-11 0:46 Sam James [this message]
-- strict thread matches above, loose matches on Subject: below --
2025-10-11 6:40 [gentoo-commits] proj/toolchain/binutils-patches:master commit in: 9999/ Sam James
2025-10-11 0:46 Sam James
2025-10-10 5:41 Sam James
2025-10-10 5:28 Sam James
2025-10-10 5:28 Sam James
2025-10-10 5:25 Sam James
2025-10-10 4:57 Sam James
2025-08-29 13:40 Sam James
2025-08-28 20:21 Sam James
2025-08-28 13:51 Sam James
2025-08-28 5:32 Sam James
2025-08-27 16:26 Sam James
2025-08-27 4:05 Sam James
2025-08-27 2:49 Sam James
2025-08-25 2:49 Sam James
2025-08-20 23:30 Sam James
2025-08-20 22:17 Sam James
2025-08-20 22:17 Sam James
2025-08-20 20:44 Sam James
2025-08-20 4:39 Sam James
2025-08-19 20:54 Sam James
2025-08-19 17:11 Sam James
2025-08-19 16:28 Sam James
2025-08-19 10:51 Sam James
2025-08-19 3:48 Sam James
2025-08-18 20:21 Sam James
2025-08-18 20:21 Sam James
2025-08-18 20:19 Sam James
2025-08-18 15:39 Sam James
2025-08-17 20:58 Sam James
2025-08-17 19:45 Sam James
2025-08-06 13:19 Sam James
2025-08-06 4:07 Sam James
2025-08-06 1:08 Sam James
2025-08-05 20:21 Sam James
2025-08-04 21:43 Sam James
2025-08-04 21:05 Sam James
2025-08-04 15:32 Sam James
2025-08-04 11:06 Sam James
2025-08-03 23:43 Sam James
2025-08-01 11:28 Sam James
2025-08-01 8:17 Sam James
2025-07-31 11:39 Sam James
2025-07-28 12:24 Andreas K. Hüttel
2025-07-24 17:25 Sam James
2025-07-24 4:03 Sam James
2025-07-24 3:46 Sam James
2025-07-23 22:37 Sam James
2025-06-14 21:52 Sam James
2025-06-13 8:00 Sam James
2025-05-14 7:14 Sam James
2025-05-14 3:59 Sam James
2025-05-05 9:46 Sam James
2025-05-05 3:06 Sam James
2025-05-04 10:15 Sam James
2025-04-10 17:35 Sam James
2025-04-09 2:24 Sam James
2025-04-08 0:36 Sam James
2025-03-29 14:18 Sam James
2025-03-12 20:21 Sam James
2025-03-06 12:54 Sam James
2025-03-06 4:54 Sam James
2025-02-03 18:02 Andreas K. Hüttel
2025-01-14 2:09 Sam James
2025-01-13 6:11 Sam James
2025-01-02 13:48 Sam James
2025-01-01 14:05 Sam James
2024-12-26 1:21 Sam James
2024-12-24 6:27 Sam James
2024-12-21 0:09 Sam James
2024-08-03 22:43 Andreas K. Hüttel
2024-06-29 17:05 Andreas K. Hüttel
2024-06-29 16:32 Andreas K. Hüttel
2024-06-29 16:32 Andreas K. Hüttel
2024-06-28 21:48 Andreas K. Hüttel
2023-10-27 0:44 Sam James
2023-10-27 0:44 Sam James
2023-07-30 14:49 Andreas K. Hüttel
2023-07-28 16:23 Andreas K. Hüttel
2023-06-30 9:21 WANG Xuerui
2023-04-02 11:44 Andreas K. Hüttel
2023-01-05 16:22 Andreas K. Hüttel
2023-01-05 16:21 Andreas K. Hüttel
2023-01-03 23:03 Andreas K. Hüttel
2023-01-02 23:50 Andreas K. Hüttel
2022-10-08 12:15 WANG Xuerui
2022-07-29 7:55 WANG Xuerui
2022-01-15 22:27 Andreas K. Hüttel
2021-08-17 20:07 Andreas K. Hüttel
2021-07-30 23:25 Andreas K. Hüttel
2021-07-24 20:57 Andreas K. Hüttel
2021-07-20 19:53 Andreas K. Hüttel
2021-07-20 19:50 Andreas K. Hüttel
2021-07-06 7:04 Sergei Trofimovich
2021-07-06 7:04 Sergei Trofimovich
2021-07-06 7:04 Sergei Trofimovich
2020-07-25 17:27 Andreas K. Hüttel
2020-07-25 12:26 Andreas K. Hüttel
2020-07-25 12:23 Andreas K. Hüttel
2020-07-25 12:20 Andreas K. Hüttel
2020-05-19 21:12 Andreas K. Hüttel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1760143608.56cd194bbf2a0a211d1818b4b42ab0c74893bb18.sam@gentoo \
--to=sam@gentoo.org \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox