diff options
author | Richard Lowe <richlowe@richlowe.net> | 2021-11-21 21:16:25 -0600 |
---|---|---|
committer | Richard Lowe <richlowe@richlowe.net> | 2022-01-24 15:47:11 -0600 |
commit | ff4c9ae3835ad2c0d7c85544aad7de6fe35d4e30 (patch) | |
tree | 3a966a909d6d3c1364fe67f7a2ce96ca83edf158 | |
parent | cc7a5a3be88241742ab4e0d7a14a0291f4e32183 (diff) | |
download | illumos-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.c | 64 | ||||
-rw-r--r-- | usr/src/cmd/sgs/libconv/common/sections.msg | 50 | ||||
-rw-r--r-- | usr/src/cmd/sgs/libld/common/files.c | 8 | ||||
-rw-r--r-- | usr/src/cmd/sgs/tools/SUNWonld-README | 1 | ||||
-rw-r--r-- | usr/src/uts/common/sys/elf.h | 15 |
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 |