diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c index 2d0428a..e82c2fe 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c @@ -1124,6 +1124,10 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp) key_t objkey; dt_link_pair_t *pair, *bufs = NULL; dt_strtab_t *strtab; +#if defined(__FreeBSD__) + Elf_Data *data_newsym, *data_newstr; + size_t newsym = 0; +#endif if ((fd = open64(obj, O_RDWR)) == -1) { return (dt_link_error(dtp, elf, fd, bufs, @@ -1368,6 +1372,32 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp) if ((pair = dt_alloc(dtp, sizeof (*pair))) == NULL) goto err; +#if defined(__FreeBSD__) + if ((pair->dlp_str = dt_alloc(dtp, len)) == NULL) { + dt_free(dtp, pair); + goto err; + } + + if ((pair->dlp_sym = + dt_alloc(dtp, nsym * symsize)) == NULL) { + dt_free(dtp, pair->dlp_str); + dt_free(dtp, pair); + goto err; + } + + pair->dlp_next = bufs; + bufs = pair; + + if ((data_newstr = elf_newdata(scn_str)) == NULL) + goto err; + data_newstr->d_size = len; + data_newstr->d_buf = pair->dlp_str; + + if ((data_newsym = elf_newdata(scn_sym)) == NULL) + goto err; + data_newsym->d_size = nsym * symsize; + data_newsym->d_buf = pair->dlp_sym; +#else if ((pair->dlp_str = dt_alloc(dtp, data_str->d_size + len)) == NULL) { dt_free(dtp, pair); @@ -1399,6 +1429,7 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp) shdr_sym.sh_size += nsym * symsize; (void) gelf_update_shdr(scn_sym, &shdr_sym); +#endif /* !defined(__FreeBSD__) */ nsym += isym; } else { @@ -1463,9 +1494,17 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp) p = strhyphenate(p + 3); /* strlen("___") */ +#if defined(__FreeBSD__) + if (dt_symtab_lookup(data_newsym, newsym, rela.r_offset, + shdr_rel.sh_info, &fsym) != 0 && + dt_symtab_lookup(data_sym, isym, rela.r_offset, + shdr_rel.sh_info, &fsym) != 0) + goto err; +#else if (dt_symtab_lookup(data_sym, isym, rela.r_offset, shdr_rel.sh_info, &fsym) != 0) goto err; +#endif if (fsym.st_name > data_str->d_size) goto err; @@ -1491,12 +1530,23 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp) STT_FUNC); dsym.st_other = ELF64_ST_VISIBILITY(STV_ELIMINATE); +#if defined(__FreeBSD__) + (void)gelf_update_sym(data_newsym, newsym, + &dsym); + + r = (char *)data_newstr->d_buf + + (istr - data_str->d_size); +#else (void) gelf_update_sym(data_sym, isym, &dsym); r = (char *)data_str->d_buf + istr; +#endif istr += 1 + sprintf(r, dt_symfmt, dt_symprefix, objkey, s); isym++; +#if defined(__FreeBSD__) + newsym++; +#endif assert(isym <= nsym); } else if (strncmp(s, dt_symprefix,