libdtrace: get rid of illumos ifdefs in dt_module_update(), fix dm_file and dm_modid
Because dt_module_update() is highly OS-specific, the ifdefs make it hard to read and follow what is going on. Also handle dm_modid, and remove handling of the ".filename" section, since we can easily fetch the filename from the module's pathname (k_stat->pathname). Reviewed by: markj Approved by: markj (mentor) Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D39177
This commit is contained in:
parent
1082307434
commit
6265da14c9
@ -1129,33 +1129,21 @@ dt_module_getctflib(dtrace_hdl_t *dtp, dt_module_t *dmp, const char *name)
|
||||
* including the path.
|
||||
*/
|
||||
static void
|
||||
#ifdef illumos
|
||||
dt_module_update(dtrace_hdl_t *dtp, const char *name)
|
||||
#else
|
||||
dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
|
||||
#endif
|
||||
{
|
||||
char fname[MAXPATHLEN];
|
||||
struct stat64 st;
|
||||
int fd, err, bits;
|
||||
#ifdef __FreeBSD__
|
||||
struct module_stat ms;
|
||||
dt_kmodule_t *dkmp;
|
||||
uint_t h;
|
||||
int modid;
|
||||
#endif
|
||||
|
||||
dt_module_t *dmp;
|
||||
const char *s;
|
||||
size_t shstrs;
|
||||
GElf_Shdr sh;
|
||||
Elf_Data *dp;
|
||||
Elf_Scn *sp;
|
||||
|
||||
#ifdef illumos
|
||||
(void) snprintf(fname, sizeof (fname),
|
||||
"%s/%s/object", OBJFS_ROOT, name);
|
||||
#else
|
||||
GElf_Ehdr ehdr;
|
||||
GElf_Phdr ph;
|
||||
char name[MAXPATHLEN];
|
||||
@ -1165,7 +1153,6 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
|
||||
|
||||
(void) strlcpy(name, k_stat->name, sizeof(name));
|
||||
(void) strlcpy(fname, k_stat->pathname, sizeof(fname));
|
||||
#endif
|
||||
|
||||
if ((fd = open(fname, O_RDONLY)) == -1 || fstat64(fd, &st) == -1 ||
|
||||
(dmp = dt_module_create(dtp, name)) == NULL) {
|
||||
@ -1174,6 +1161,9 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
|
||||
return;
|
||||
}
|
||||
|
||||
(void) strlcpy(dmp->dm_file, fname, sizeof(dmp->dm_file));
|
||||
dmp->dm_modid = k_stat->id;
|
||||
|
||||
/*
|
||||
* Since the module can unload out from under us (and /system/object
|
||||
* will return ENOENT), tell libelf to cook the entire file now and
|
||||
@ -1206,7 +1196,6 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
|
||||
dt_module_destroy(dtp, dmp);
|
||||
return;
|
||||
}
|
||||
#if defined(__FreeBSD__)
|
||||
mapbase = (uintptr_t)k_stat->address;
|
||||
gelf_getehdr(dmp->dm_elf, &ehdr);
|
||||
is_elf_obj = (ehdr.e_type == ET_REL);
|
||||
@ -1219,7 +1208,6 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Iterate over the section headers locating various sections of
|
||||
* interest and use their attributes to flesh out the dt_module_t.
|
||||
@ -1228,7 +1216,6 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
|
||||
if (gelf_getshdr(sp, &sh) == NULL || sh.sh_type == SHT_NULL ||
|
||||
(s = elf_strptr(dmp->dm_elf, shstrs, sh.sh_name)) == NULL)
|
||||
continue; /* skip any malformed sections */
|
||||
#if defined(__FreeBSD__)
|
||||
if (sh.sh_size == 0)
|
||||
continue;
|
||||
if (sh.sh_type == SHT_PROGBITS || sh.sh_type == SHT_NOBITS) {
|
||||
@ -1240,7 +1227,6 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
|
||||
dmp->dm_sec_offsets[elf_ndxscn(sp)] = sh.sh_addr;
|
||||
mapbase += sh.sh_size;
|
||||
}
|
||||
#endif
|
||||
if (strcmp(s, ".text") == 0) {
|
||||
dmp->dm_text_size = sh.sh_size;
|
||||
dmp->dm_text_va = sh.sh_addr;
|
||||
@ -1254,17 +1240,10 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
|
||||
(dp = elf_getdata(sp, NULL)) != NULL) {
|
||||
bcopy(dp->d_buf, &dmp->dm_info,
|
||||
MIN(sh.sh_size, sizeof (dmp->dm_info)));
|
||||
} else if (strcmp(s, ".filename") == 0 &&
|
||||
(dp = elf_getdata(sp, NULL)) != NULL) {
|
||||
(void) strlcpy(dmp->dm_file,
|
||||
dp->d_buf, sizeof (dmp->dm_file));
|
||||
}
|
||||
}
|
||||
|
||||
dmp->dm_flags |= DT_DM_KERNEL;
|
||||
#ifdef illumos
|
||||
dmp->dm_modid = (int)OBJFS_MODID(st.st_ino);
|
||||
#else
|
||||
/*
|
||||
* Include .rodata and special sections into .text.
|
||||
* This depends on default section layout produced by GNU ld
|
||||
@ -1285,12 +1264,10 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif /* illumos */
|
||||
|
||||
if (dmp->dm_info.objfs_info_primary)
|
||||
dmp->dm_flags |= DT_DM_PRIMARY;
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
ms.version = sizeof(ms);
|
||||
for (modid = kldfirstmod(k_stat->id); modid > 0;
|
||||
modid = modnext(modid)) {
|
||||
@ -1315,7 +1292,6 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
|
||||
dkmp->dkm_module = dmp;
|
||||
dtp->dt_kmods[h] = dkmp;
|
||||
}
|
||||
#endif
|
||||
|
||||
dt_dprintf("opened %d-bit module %s (%s) [%d]\n",
|
||||
bits, dmp->dm_name, dmp->dm_file, dmp->dm_modid);
|
||||
|
Loading…
Reference in New Issue
Block a user