diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c index 8dad7428722e..4f72c98b772f 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c @@ -51,6 +51,7 @@ #ifdef illumos #include #else +#include #include #include #include @@ -1189,13 +1190,31 @@ dt_link_error(dtrace_hdl_t *dtp, Elf *elf, int fd, dt_link_pair_t *bufs, return (dt_set_errno(dtp, EDT_COMPILER)); } +static int +hash_obj(const char *obj, int fd) +{ + struct stat sb; + unsigned int h; + int error; + + error = fstat(fd, &sb); + if (error != 0) + return (-1); + + for (h = 2166136261u; *obj != '\0'; obj++) + h = (h ^ *obj) * 16777619; + h &= 0xffff; + h |= (sb.st_size & 0x7fff) << 16; + return (h); +} + static int process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp) { static const char dt_prefix[] = "__dtrace"; static const char dt_enabled[] = "enabled"; static const char dt_symprefix[] = "$dtrace"; - static const char dt_symfmt[] = "%s%ld.%s"; + static const char dt_symfmt[] = "%s%u.%s"; static const char dt_weaksymfmt[] = "%s.%s"; char probename[DTRACE_NAMELEN]; int fd, i, ndx, eprobe, mod = 0; @@ -1212,7 +1231,7 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp) dt_probe_t *prp; uint32_t off, eclass, emachine1, emachine2; size_t symsize, osym, nsym, isym, istr, len; - key_t objkey; + unsigned int objkey; dt_link_pair_t *pair, *bufs = NULL; dt_strtab_t *strtab; void *tmp; @@ -1288,10 +1307,9 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp) * system in order to disambiguate potential conflicts between files of * the same name which contain identially named local symbols. */ - if ((objkey = ftok(obj, 0)) == (key_t)-1) { + if ((objkey = hash_obj(obj, fd)) == (unsigned int)-1) return (dt_link_error(dtp, elf, fd, bufs, "failed to generate unique key for object file: %s", obj)); - } scn_rel = NULL; while ((scn_rel = elf_nextscn(elf, scn_rel)) != NULL) {