summaryrefslogtreecommitdiff
path: root/usr/src/tools/ctf/cvt/dwarf.c
diff options
context:
space:
mode:
authorRichard Lowe <richlowe@richlowe.net>2012-07-09 21:10:26 +0100
committerRichard Lowe <richlowe@richlowe.net>2012-07-09 21:10:26 +0100
commit6188327ddad50579ccb20b231a3e08e20e195bc0 (patch)
treeba6d36dcb5d6df7d61f42c502f7657850cfdeb5f /usr/src/tools/ctf/cvt/dwarf.c
parent57221772c3fc05faba04bf48ddff45abf2bbf2bd (diff)
downloadillumos-joyent-6188327ddad50579ccb20b231a3e08e20e195bc0.tar.gz
2978 ctfconvert still needs to ignore legitimately dataless files on SPARC
Reviewed by: Keith Wesolowski <keith.wesolowski@joyent.com> Reviewed by: Jason King <jason.brian.king@gmail.com> Approved by: Garrett D'Amore <garrett@damore.org>
Diffstat (limited to 'usr/src/tools/ctf/cvt/dwarf.c')
-rw-r--r--usr/src/tools/ctf/cvt/dwarf.c44
1 files changed, 38 insertions, 6 deletions
diff --git a/usr/src/tools/ctf/cvt/dwarf.c b/usr/src/tools/ctf/cvt/dwarf.c
index ef92e384e4..e261818d3a 100644
--- a/usr/src/tools/ctf/cvt/dwarf.c
+++ b/usr/src/tools/ctf/cvt/dwarf.c
@@ -1839,21 +1839,53 @@ die_resolve(dwarf_t *dw)
}
/*
- * Any object containing at least one allocatable section of non-0 size is
- * taken to be a file which should contain DWARF type information
+ * Any object containing a function or object symbol at any scope should also
+ * contain DWARF data.
*/
static boolean_t
should_have_dwarf(Elf *elf)
{
Elf_Scn *scn = NULL;
+ Elf_Data *data = NULL;
+ GElf_Shdr shdr;
+ GElf_Sym sym;
+ uint32_t symdx = 0;
+ size_t nsyms = 0;
+ boolean_t found = B_FALSE;
while ((scn = elf_nextscn(elf, scn)) != NULL) {
- GElf_Shdr shdr;
gelf_getshdr(scn, &shdr);
- if ((shdr.sh_flags & SHF_ALLOC) &&
- (shdr.sh_size != 0))
- return (B_TRUE);
+ if (shdr.sh_type == SHT_SYMTAB) {
+ found = B_TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ terminate("cannot convert stripped objects\n");
+
+ data = elf_getdata(scn, NULL);
+ nsyms = shdr.sh_size / shdr.sh_entsize;
+
+ for (symdx = 0; symdx < nsyms; symdx++) {
+ gelf_getsym(data, symdx, &sym);
+
+ if ((GELF_ST_TYPE(sym.st_info) == STT_FUNC) ||
+ (GELF_ST_TYPE(sym.st_info) == STT_TLS) ||
+ (GELF_ST_TYPE(sym.st_info) == STT_OBJECT)) {
+ char *name;
+
+ name = elf_strptr(elf, shdr.sh_link, sym.st_name);
+
+ /* Studio emits these local symbols regardless */
+ if ((strcmp(name, "Bbss.bss") != 0) &&
+ (strcmp(name, "Ttbss.bss") != 0) &&
+ (strcmp(name, "Ddata.data") != 0) &&
+ (strcmp(name, "Ttdata.data") != 0) &&
+ (strcmp(name, "Drodata.rodata") != 0))
+ return (B_TRUE);
+ }
}
return (B_FALSE);