aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2025-07-25 19:51:58 +0100
committerAndrew Burgess <aburgess@redhat.com>2025-08-14 16:06:47 +0100
commitea6ec00ff4520895735e4913cb90c933c7296f04 (patch)
treebb1f7135313068772df075070e991c96c402fb4d
parentd048eee2910878bf46f333f2fdc8ef940bd1638e (diff)
downloadbinutils-ea6ec00ff4520895735e4913cb90c933c7296f04.zip
binutils-ea6ec00ff4520895735e4913cb90c933c7296f04.tar.gz
binutils-ea6ec00ff4520895735e4913cb90c933c7296f04.tar.bz2
bfd: support for NT_386_TLS notes
In a later commit I'd like to add support to GDB for including the NT_386_TLS note in the core files that GDB creates (using 'gcore' command). To achieve this we need some standard boilerplate code added to bfd. The only part of this patch which I think needs consideration is the name I selected for the pseudo section to hold the note contents when a core file is loaded. I chose '.reg-i386-tls'. The '.reg' prefix is the standard used by most other pseudo sections, and the '-i386-tls' suffix seemed to match the note name, though I added the 'i' to 'i386', instead of just using '.reg-386-tls'. I thought 'i386' seemed clearer. There's no test included here, but when I merge the NT_386_TLS creation to GDB it will depend on this and act as a test. I plan to post that work to the GDB list once this patch is merged.
-rw-r--r--bfd/elf-bfd.h2
-rw-r--r--bfd/elf.c28
2 files changed, 30 insertions, 0 deletions
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index f24342c..accdd6d 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2927,6 +2927,8 @@ extern char *elfcore_write_xstatereg
(bfd *, char *, int *, const void *, int);
extern char *elfcore_write_x86_segbases
(bfd *, char *, int *, const void *, int);
+extern char *elfcore_write_i386_tls
+ (bfd *, char *, int *, const void *, int);
extern char *elfcore_write_ppc_vmx
(bfd *, char *, int *, const void *, int);
extern char *elfcore_write_ppc_vsx
diff --git a/bfd/elf.c b/bfd/elf.c
index 1b2e331..4f6bcde 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -49,6 +49,10 @@ SECTION
#include CORE_HEADER
#endif
+/* Name of a pseudo-section which represents NT_386_TLS notes within a core
+ file. */
+#define PSEUDO_SECTION_NAME_I386_TLS ".reg-i386-tls"
+
static int elf_sort_sections (const void *, const void *);
static bool assign_file_positions_except_relocs (bfd *, struct bfd_link_info *);
static bool swap_out_syms (bfd *, struct elf_strtab_hash **, int,
@@ -10674,6 +10678,13 @@ elfcore_grok_gdb_tdesc (bfd *abfd, Elf_Internal_Note *note)
}
static bool
+elfcore_grok_i386_tls (bfd *abfd, Elf_Internal_Note *note)
+{
+ return elfcore_make_note_pseudosection (abfd, PSEUDO_SECTION_NAME_I386_TLS,
+ note);
+}
+
+static bool
elfcore_grok_loongarch_cpucfg (bfd *abfd, Elf_Internal_Note *note)
{
return elfcore_make_note_pseudosection (abfd, ".reg-loongarch-cpucfg", note);
@@ -11336,6 +11347,13 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note)
else
return true;
+ case NT_386_TLS:
+ if (note->namesz == 6
+ && strcmp (note->namedata, "LINUX") == 0)
+ return elfcore_grok_i386_tls (abfd, note);
+ else
+ return true;
+
case NT_ARM_HW_BREAK:
if (note->namesz == 6
&& strcmp (note->namedata, "LINUX") == 0)
@@ -12594,6 +12612,14 @@ elfcore_write_x86_segbases (bfd *abfd, char *buf, int *bufsiz,
}
char *
+elfcore_write_i386_tls (bfd *abfd, char *buf, int *bufsiz,
+ const void *regs, int size)
+{
+ return elfcore_write_note (abfd, buf, bufsiz, "LINUX", NT_386_TLS,
+ regs, size);
+}
+
+char *
elfcore_write_ppc_vmx (bfd *abfd,
char *buf,
int *bufsiz,
@@ -13287,6 +13313,8 @@ elfcore_write_register_note (bfd *abfd,
return elfcore_write_loongarch_lsx (abfd, buf, bufsiz, data, size);
if (strcmp (section, ".reg-loongarch-lasx") == 0)
return elfcore_write_loongarch_lasx (abfd, buf, bufsiz, data, size);
+ if (strcmp (section, PSEUDO_SECTION_NAME_I386_TLS) == 0)
+ return elfcore_write_i386_tls (abfd, buf, bufsiz, data, size);
return NULL;
}