summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Lowe <richlowe@richlowe.net>2021-11-21 21:16:25 -0600
committerRichard Lowe <richlowe@richlowe.net>2022-01-24 15:47:11 -0600
commitff4c9ae3835ad2c0d7c85544aad7de6fe35d4e30 (patch)
tree3a966a909d6d3c1364fe67f7a2ce96ca83edf158
parentcc7a5a3be88241742ab4e0d7a14a0291f4e32183 (diff)
downloadillumos-gate-ff4c9ae3835ad2c0d7c85544aad7de6fe35d4e30.tar.gz
14401 elfdump should understand LLVM section types
Reviewed by: Robert Mustacchi <rm@fingolfin.org> Reviewed by: Toomas Soome <tsoome@me.com> Approved by: Dan McDonald <danmcd@joyent.com>
-rw-r--r--usr/src/cmd/sgs/libconv/common/sections.c64
-rw-r--r--usr/src/cmd/sgs/libconv/common/sections.msg50
-rw-r--r--usr/src/cmd/sgs/libld/common/files.c8
-rw-r--r--usr/src/cmd/sgs/tools/SUNWonld-README1
-rw-r--r--usr/src/uts/common/sys/elf.h15
5 files changed, 133 insertions, 5 deletions
diff --git a/usr/src/cmd/sgs/libconv/common/sections.c b/usr/src/cmd/sgs/libconv/common/sections.c
index 46e77b14ab..19fa9ee006 100644
--- a/usr/src/cmd/sgs/libconv/common/sections.c
+++ b/usr/src/cmd/sgs/libconv/common/sections.c
@@ -40,9 +40,9 @@ sec_type_strings(conv_iter_osabi_t osabi, Half mach, Conv_fmt_flags_t fmt_flags)
{
/*
* This routine can return an array with 1 generic array, up to
- * three osabi arrays, two machine arrays, plus the NULL termination.
+ * four osabi arrays, two machine arrays, plus the NULL termination.
*/
-#define MAX_RET 7
+#define MAX_RET 8
static const Msg secs_def[SHT_NUM] = {
MSG_SHT_NULL, MSG_SHT_PROGBITS,
@@ -243,6 +243,48 @@ sec_type_strings(conv_iter_osabi_t osabi, Half mach, Conv_fmt_flags_t fmt_flags)
static const conv_ds_msg_t ds_amd64_nf = {
CONV_DS_MSG_INIT(SHT_AMD64_UNWIND, amd64_nf) };
+ /* LLVM "OS-specific" range */
+ static const Msg llvm_def[] = {
+ MSG_SHT_LLVM_ODRTAB, MSG_SHT_LLVM_LINKER_OPTIONS,
+ MSG_SHT_LLVM_UNKNOWN1,
+ MSG_SHT_LLVM_ADDRSIG, MSG_SHT_LLVM_DEPENDENT_LIBRARIES,
+ MSG_SHT_LLVM_SYMPART, MSG_SHT_LLVM_PART_EHDR,
+ MSG_SHT_LLVM_PART_PHDR, MSG_SHT_LLVM_BB_ADDR_MAP,
+ MSG_SHT_LLVM_CALL_GRAPH_PROFILE
+ };
+ static const Msg llvm_dmp[] = {
+ MSG_SHT_LLVM_ODRTAB_DMP, MSG_SHT_LLVM_LINKER_OPTIONS_DMP,
+ MSG_SHT_LLVM_UNKNOWN1_DMP, MSG_SHT_LLVM_ADDRSIG_DMP,
+ MSG_SHT_LLVM_DEPENDENT_LIBRARIES_DMP,
+ MSG_SHT_LLVM_SYMPART_DMP, MSG_SHT_LLVM_PART_EHDR_DMP,
+ MSG_SHT_LLVM_PART_PHDR_DMP, MSG_SHT_LLVM_BB_ADDR_MAP_DMP,
+ MSG_SHT_LLVM_CALL_GRAPH_PROFILE_DMP
+ };
+ static const Msg llvm_cf[] = {
+ MSG_SHT_LLVM_ODRTAB_CF, MSG_SHT_LLVM_LINKER_OPTIONS_CF,
+ MSG_SHT_LLVM_UNKNOWN1_CF, MSG_SHT_LLVM_ADDRSIG_CF,
+ MSG_SHT_LLVM_DEPENDENT_LIBRARIES_CF,
+ MSG_SHT_LLVM_SYMPART_CF, MSG_SHT_LLVM_PART_EHDR_CF,
+ MSG_SHT_LLVM_PART_PHDR_CF, MSG_SHT_LLVM_BB_ADDR_MAP_CF,
+ MSG_SHT_LLVM_CALL_GRAPH_PROFILE_CF
+ };
+ static const Msg llvm_nf[] = {
+ MSG_SHT_LLVM_ODRTAB_NF, MSG_SHT_LLVM_LINKER_OPTIONS_NF,
+ MSG_SHT_LLVM_UNKNOWN1_NF, MSG_SHT_LLVM_ADDRSIG_NF,
+ MSG_SHT_LLVM_DEPENDENT_LIBRARIES_NF,
+ MSG_SHT_LLVM_SYMPART_NF, MSG_SHT_LLVM_PART_EHDR_NF,
+ MSG_SHT_LLVM_PART_PHDR_NF, MSG_SHT_LLVM_BB_ADDR_MAP_NF,
+ MSG_SHT_LLVM_CALL_GRAPH_PROFILE_NF
+ };
+
+ static const conv_ds_msg_t ds_llvm_def = {
+ CONV_DS_MSG_INIT(SHT_LLVM_ODRTAB, llvm_def) };
+ static const conv_ds_msg_t ds_llvm_dmp = {
+ CONV_DS_MSG_INIT(SHT_LLVM_ODRTAB, llvm_dmp) };
+ static const conv_ds_msg_t ds_llvm_cf = {
+ CONV_DS_MSG_INIT(SHT_LLVM_ODRTAB, llvm_cf) };
+ static const conv_ds_msg_t ds_llvm_nf = {
+ CONV_DS_MSG_INIT(SHT_LLVM_ODRTAB, llvm_nf) };
static const conv_ds_t *retarr[MAX_RET];
int retndx = 0;
@@ -281,6 +323,24 @@ sec_type_strings(conv_iter_osabi_t osabi, Half mach, Conv_fmt_flags_t fmt_flags)
}
}
+ if ((osabi == ELFOSABI_NONE) || (osabi == ELFOSABI_LINUX) ||
+ (osabi == ELFOSABI_SOLARIS) || (osabi == CONV_OSABI_ALL)) {
+ switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
+ case CONV_FMT_ALT_DUMP:
+ retarr[retndx++] = CONV_DS_ADDR(ds_llvm_dmp);
+ break;
+ case CONV_FMT_ALT_CF:
+ retarr[retndx++] = CONV_DS_ADDR(ds_llvm_cf);
+ break;
+ case CONV_FMT_ALT_NF:
+ retarr[retndx++] = CONV_DS_ADDR(ds_llvm_nf);
+ break;
+ default:
+ retarr[retndx++] = CONV_DS_ADDR(ds_llvm_def);
+ break;
+ }
+ }
+
if ((osabi == ELFOSABI_LINUX) || (osabi == CONV_OSABI_ALL)) {
switch (CONV_TYPE_FMT_ALT(fmt_flags)) {
case CONV_FMT_ALT_DUMP:
diff --git a/usr/src/cmd/sgs/libconv/common/sections.msg b/usr/src/cmd/sgs/libconv/common/sections.msg
index 0a34843395..7dfa7f7aa3 100644
--- a/usr/src/cmd/sgs/libconv/common/sections.msg
+++ b/usr/src/cmd/sgs/libconv/common/sections.msg
@@ -208,6 +208,56 @@
@ MSG_SHT_SPARC_GOTDATA_CF "SHT_SPARC_GOTDATA"
@ MSG_SHT_SPARC_GOTDATA_NF "sparc_gotdata"
+@ MSG_SHT_LLVM_ODRTAB "[ SHT_LLVM_ODRTAB ]" # 0x6fff4c00
+@ MSG_SHT_LLVM_ODRTAB_DMP "ODRTAB"
+@ MSG_SHT_LLVM_ODRTAB_CF "SHT_LLVM_ODRTAB"
+@ MSG_SHT_LLVM_ODRTAB_NF "llvm_odrtab"
+
+@ MSG_SHT_LLVM_LINKER_OPTIONS "[ SHT_LLVM_LINK_OPTIONS ]" # 0x6fff4c01
+@ MSG_SHT_LLVM_LINKER_OPTIONS_DMP "LINK_OPTIONS"
+@ MSG_SHT_LLVM_LINKER_OPTIONS_CF "SHT_LLVM_LINK_OPTIONS"
+@ MSG_SHT_LLVM_LINKER_OPTIONS_NF "llvm_link_options"
+
+@ MSG_SHT_LLVM_UNKNOWN1 "[ SHT_LLVM_UNKNOWN1 ]" # 0x6fff4c02
+@ MSG_SHT_LLVM_UNKNOWN1_DMP "LLVM_UNKNOWN1"
+@ MSG_SHT_LLVM_UNKNOWN1_CF "SHT_LLVM_UNKNOWN1"
+@ MSG_SHT_LLVM_UNKNOWN1_NF "llvm_unknown1"
+
+@ MSG_SHT_LLVM_ADDRSIG "[ SHT_LLVM_ADDRSIG ]" # 0x6fff4c03
+@ MSG_SHT_LLVM_ADDRSIG_DMP "ADDRSIG"
+@ MSG_SHT_LLVM_ADDRSIG_CF "SHT_LLVM_ADDRSIG"
+@ MSG_SHT_LLVM_ADDRSIG_NF "llvm_addrsig"
+
+@ MSG_SHT_LLVM_DEPENDENT_LIBRARIES "[ SHT_LLVM_DEPENDENT_LIBRARIES ]" # 0x6fff4c04
+@ MSG_SHT_LLVM_DEPENDENT_LIBRARIES_DMP "DEPENDENT_LIBRARIES"
+@ MSG_SHT_LLVM_DEPENDENT_LIBRARIES_CF "SHT_LLVM_DEPENDENT_LIBRARIES"
+@ MSG_SHT_LLVM_DEPENDENT_LIBRARIES_NF "llvm_dependent_libraries"
+
+@ MSG_SHT_LLVM_SYMPART "[ SHT_LLVM_SYMPART ]" # 0x6fff4c05
+@ MSG_SHT_LLVM_SYMPART_DMP "LLVM_SYMPART"
+@ MSG_SHT_LLVM_SYMPART_CF "SHT_LLVM_SYMPART"
+@ MSG_SHT_LLVM_SYMPART_NF "llvm_sympart"
+
+@ MSG_SHT_LLVM_PART_EHDR "[ SHT_LLVM_PART_EHDR ]" # 0x6fff4c06
+@ MSG_SHT_LLVM_PART_EHDR_DMP "LLVM_PART_EHDR"
+@ MSG_SHT_LLVM_PART_EHDR_CF "SHT_LLVM_PART_EHDR"
+@ MSG_SHT_LLVM_PART_EHDR_NF "llvm_part_ehdr"
+
+@ MSG_SHT_LLVM_PART_PHDR "[ SHT_LLVM_PART_PHDR ]" # 0x6fff4c07
+@ MSG_SHT_LLVM_PART_PHDR_DMP "LLVM_PART_PHDR"
+@ MSG_SHT_LLVM_PART_PHDR_CF "SHT_LLVM_PART_PHDR"
+@ MSG_SHT_LLVM_PART_PHDR_NF "llvm_part_phdr"
+
+@ MSG_SHT_LLVM_BB_ADDR_MAP "[ SHT_LLVM_BB_ADDR_MAP ]" # 0x6fff4c08
+@ MSG_SHT_LLVM_BB_ADDR_MAP_DMP "LLVM_BB_ADDR_MAP"
+@ MSG_SHT_LLVM_BB_ADDR_MAP_CF "SHT_LLVM_BB_ADDR_MAP"
+@ MSG_SHT_LLVM_BB_ADDR_MAP_NF "llvm_bb_addr_map"
+
+@ MSG_SHT_LLVM_CALL_GRAPH_PROFILE "[ SHT_LLVM_CALL_GRAPH_PROFILE ]" # 0x6fff4c09
+@ MSG_SHT_LLVM_CALL_GRAPH_PROFILE_DMP "LLVM_CALL_GRAPH_PROFILE"
+@ MSG_SHT_LLVM_CALL_GRAPH_PROFILE_CF "SHT_LLVM_CALL_GRAPH_PROFILE"
+@ MSG_SHT_LLVM_CALL_GRAPH_PROFILE_NF "llvm_call_graph_profile"
+
@ MSG_SHN_AFTER "[ SHN_AFTER ]"
@ MSG_SHN_BEFORE "[ SHN_BEFORE ]"
diff --git a/usr/src/cmd/sgs/libld/common/files.c b/usr/src/cmd/sgs/libld/common/files.c
index b520d9d5bf..1fefa162cc 100644
--- a/usr/src/cmd/sgs/libld/common/files.c
+++ b/usr/src/cmd/sgs/libld/common/files.c
@@ -1396,7 +1396,8 @@ invalid_section(const char *name, Ifl_desc *ifl, Shdr *shdr, Elf_Scn *scn,
ld_eprintf(ofl, ERR_WARNING, MSG_INTL(MSG_FIL_INVALSEC),
ifl->ifl_name, EC_WORD(ndx), name,
conv_sec_type(ifl->ifl_ehdr->e_ident[EI_OSABI],
- ifl->ifl_ehdr->e_machine, shdr->sh_type, 0, &inv_buf));
+ ifl->ifl_ehdr->e_machine, shdr->sh_type, CONV_FMT_ALT_CF,
+ &inv_buf));
return (1);
}
@@ -2385,7 +2386,8 @@ rel_process(Is_desc *isc, Ifl_desc *ifl, Ofl_desc *ofl)
ld_eprintf(ofl, ERR_FATAL, MSG_INTL(MSG_FIL_INVALSEC),
ifl->ifl_name, EC_WORD(isc->is_scnndx), isc->is_name,
conv_sec_type(ifl->ifl_ehdr->e_ident[EI_OSABI],
- ifl->ifl_ehdr->e_machine, shdr->sh_type, 0, &inv_buf));
+ ifl->ifl_ehdr->e_machine, shdr->sh_type, CONV_FMT_ALT_CF,
+ &inv_buf));
return (0);
}
@@ -2692,7 +2694,7 @@ process_elf(Ifl_desc *ifl, Elf *elf, Ofl_desc *ofl)
EC_WORD(ndx), name, conv_sec_type(
ifl->ifl_ehdr->e_ident[EI_OSABI],
ifl->ifl_ehdr->e_machine,
- shdr->sh_type, 0, &inv_buf));
+ shdr->sh_type, CONV_FMT_ALT_CF, &inv_buf));
}
/*
diff --git a/usr/src/cmd/sgs/tools/SUNWonld-README b/usr/src/cmd/sgs/tools/SUNWonld-README
index 1e15c9fbdc..5429da0a1e 100644
--- a/usr/src/cmd/sgs/tools/SUNWonld-README
+++ b/usr/src/cmd/sgs/tools/SUNWonld-README
@@ -1685,3 +1685,4 @@ Bugid Risk Synopsis
14283 ldd should not complain about non-executable shared objects
14308 discard SHF_EXCLUDE sections when linking kernel modules
14319 ld shouldn't warn about SHF_EXCLUDE unknown sections
+14401 elfdump should understand LLVM section types
diff --git a/usr/src/uts/common/sys/elf.h b/usr/src/uts/common/sys/elf.h
index 581d898c1d..3d053de531 100644
--- a/usr/src/uts/common/sys/elf.h
+++ b/usr/src/uts/common/sys/elf.h
@@ -615,6 +615,21 @@ typedef struct {
#define SHT_GNU_LIBLIST 0x6ffffff7 /* Prelink library list */
#define SHT_CHECKSUM 0x6ffffff8 /* Checksum for DSO content */
+/*
+ * LLVM-specific section types, actually independent of any (ELF) OS.
+ * See: https://llvm.org/docs/Extensions.html
+ */
+#define SHT_LLVM_ODRTAB 0x6fff4c00 /* ODR Table */
+#define SHT_LLVM_LINKER_OPTIONS 0x6fff4c01 /* Linker options */
+#define SHT_LLVM_UNKNOWN1 0x6fff4c02 /* previously call graph profile */
+#define SHT_LLVM_ADDRSIG 0x6fff4c03 /* significant address table */
+#define SHT_LLVM_DEPENDENT_LIBRARIES 0x6fff4c04 /* dependent libraries. */
+#define SHT_LLVM_SYMPART 0x6fff4c05 /* symbol partition specs. */
+#define SHT_LLVM_PART_EHDR 0x6fff4c06 /* ehdr for loadable part. */
+#define SHT_LLVM_PART_PHDR 0x6fff4c07 /* phdrs for loadable part. */
+#define SHT_LLVM_BB_ADDR_MAP 0x6fff4c08 /* basic block addr map */
+#define SHT_LLVM_CALL_GRAPH_PROFILE 0x6fff4c09 /* call graph profile */
+
#define SHT_LOPROC 0x70000000 /* processor specific range */
#define SHT_HIPROC 0x7fffffff