Mercurial > illumos > illumos-gate
changeset 3466:4cc6ca6917b5
PSARC/2006/714 ld(1) mapfile: symbol interpose definition
6494214 Refinements to symbolic binding, symbol declarations and interposition
6500110 *file* could produce better error diagnostics
line wrap: on
line diff
--- a/usr/src/Makefile.master Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/Makefile.master Mon Jan 22 19:26:57 2007 -0800 @@ -707,7 +707,6 @@ BLOCAL= -Blocal BREDUCE= -Breduce BSTATIC= -Bstatic -BSYMBOLIC= -Bsymbolic ZCOMBRELOC= -zcombreloc ZDEFS= -zdefs
--- a/usr/src/cmd/file/Makefile Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/file/Makefile Mon Jan 22 19:26:57 2007 -0800 @@ -19,7 +19,7 @@ # CDDL HEADER END # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -64,6 +64,9 @@ $(LINK.c) $(XPG4OBJS) -o $@ $(LDLIBS) $(POST_PROCESS) +%.o: %.c + $(COMPILE.c) -o $@ $< + xpg4_%.o: %.c $(COMPILE.c) -o $@ $<
--- a/usr/src/cmd/file/file.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/file/file.c Mon Jan 22 19:26:57 2007 -0800 @@ -26,7 +26,7 @@ /* All Rights Reserved */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -135,7 +135,7 @@ /* start for MB env */ -static wchar_t wchar; +static wchar_t wchar; static int length; static int IS_ascii; static int Max; @@ -165,7 +165,7 @@ static Elf *is_elf_file(int elffd); static void ar_coff_or_aout(int ifd); static int type(char *file); -static int def_position_tests(void); +static int def_position_tests(char *file); static void def_context_tests(void); static int troffint(char *bp, int n); static int lookup(char **tab); @@ -174,9 +174,9 @@ static int sccs(void); static int english(char *bp, int n); static int old_core(Elf *elf, GElf_Ehdr *ehdr, int format); -static int core(Elf *elf, GElf_Ehdr *ehdr, int format); +static int core(Elf *elf, GElf_Ehdr *ehdr, int format, char *file); static int shellscript(char buf[], struct stat64 *sb); -static int elf_check(Elf *elf); +static int elf_check(Elf *elf, char *file); static int get_door_target(char *, char *, size_t); static int zipfile(char *, int); static int is_crash_dump(const char *, int); @@ -198,6 +198,12 @@ #define prf(x) (void) printf("%s:%s", x, (int)strlen(x) > 6 ? "\t" : "\t\t"); #endif /* XPG4 */ +/* + * Static program identifier - used to prevent localization of the name "file" + * within individual error messages. + */ +const char *File = "file"; + int main(int argc, char **argv) { @@ -239,23 +245,28 @@ case 'f': fflg++; + errno = 0; if ((fl = fopen(optarg, "r")) == NULL) { - (void) fprintf(stderr, - gettext("cannot open %s\n"), optarg); + int err = errno; + (void) fprintf(stderr, gettext("%s: cannot " + "open file %s: %s\n"), File, optarg, + err ? strerror(err) : ""); usage(); } pathlen = pathconf("/", _PC_PATH_MAX); if (pathlen == -1) { - (void) fprintf(stderr, - gettext("pathconf: cannot determine " - "maximum path length\n")); + int err = errno; + (void) fprintf(stderr, gettext("%s: cannot " + "determine maximum path length: %s\n"), + File, strerror(err)); exit(1); } pathlen += 2; /* for null and newline in fgets */ - ap = malloc(pathlen * sizeof (char)); - if (ap == NULL) { - perror("malloc"); - exit(1); + if ((ap = malloc(pathlen * sizeof (char))) == NULL) { + int err = errno; + (void) fprintf(stderr, gettext("%s: malloc " + "failed: %s\n"), File, strerror(err)); + exit(2); } break; @@ -366,24 +377,29 @@ } if (maxmagicoffset < (intmax_t)FBSZ) maxmagicoffset = (intmax_t)FBSZ; - if ((magicbuf = (char *)malloc(maxmagicoffset)) == NULL) { - (void) fprintf(stderr, gettext("malloc failed\n")); + if ((magicbuf = malloc(maxmagicoffset)) == NULL) { + int err = errno; + (void) fprintf(stderr, gettext("%s: malloc failed: %s\n"), + File, strerror(err)); exit(2); } if (cflg) { f_prtmtab(); if (ferror(stdout) != 0) { - (void) fprintf(stderr, gettext("file: error writing to " - "stdout\n")); + (void) fprintf(stderr, gettext("%s: error writing to " + "stdout\n"), File); exit(1); } if (fclose(stdout) != 0) { - perror(gettext("file: fclose failed")); + int err = errno; + (void) fprintf(stderr, gettext("%s: fclose " + "failed: %s\n"), File, strerror(err)); exit(1); } exit(0); } + for (; fflg || optind < argc; optind += !fflg) { register int l; @@ -405,16 +421,18 @@ } if (ap != NULL) free(ap); - if (tret != 0) { + if (tret != 0) exit(tret); - } + if (ferror(stdout) != 0) { - (void) fprintf(stderr, gettext("file: error writing to " - "stdout\n")); + (void) fprintf(stderr, gettext("%s: error writing to " + "stdout\n"), File); exit(1); } if (fclose(stdout) != 0) { - perror(gettext("file: fclose failed")); + int err = errno; + (void) fprintf(stderr, gettext("%s: fclose failed: %s\n"), + File, strerror(err)); exit(1); } return (0); @@ -431,8 +449,9 @@ ifd = -1; if ((*statf)(file, &mbuf) < 0) { if (statf == lstat64 || lstat64(file, &mbuf) < 0) { + int err = errno; (void) printf(gettext("cannot open: %s\n"), - strerror(errno)); + strerror(err)); return (0); /* POSIX.2 */ } } @@ -457,8 +476,9 @@ case S_IFLNK: if ((cc = readlink(file, buf, BUFSIZ)) < 0) { + int err = errno; (void) printf(gettext("readlink error: %s\n"), - strerror(errno)); + strerror(err)); return (1); } buf[cc] = '\0'; @@ -494,20 +514,23 @@ ifd = open64(file, O_RDONLY); if (ifd < 0) { - (void) printf(gettext("cannot open: %s\n"), strerror(errno)); + int err = errno; + (void) printf(gettext("cannot open: %s\n"), strerror(err)); return (0); /* POSIX.2 */ } /* need another fd for elf, since we might want to read the file too */ elffd = open64(file, O_RDONLY); if (elffd < 0) { - (void) printf(gettext("cannot open: %s\n"), strerror(errno)); + int err = errno; + (void) printf(gettext("cannot open: %s\n"), strerror(err)); (void) close(ifd); ifd = -1; return (0); /* POSIX.2 */ } if ((fbsz = read(ifd, fbuf, FBSZ)) == -1) { - (void) printf(gettext("cannot read: %s\n"), strerror(errno)); + int err = errno; + (void) printf(gettext("cannot read: %s\n"), strerror(err)); (void) close(ifd); ifd = -1; return (0); /* POSIX.2 */ @@ -523,8 +546,9 @@ * which need to execute before the default tests. */ if ((mread = pread(ifd, (void*)magicbuf, (size_t)maxmagicoffset, - (off_t)0)) == -1) { - (void) printf(gettext("cannot read: %s\n"), strerror(errno)); + (off_t)0)) == -1) { + int err = errno; + (void) printf(gettext("cannot read: %s\n"), strerror(err)); fd_cleanup(); return (0); } @@ -555,7 +579,7 @@ * default position-dependent tests, * plus non-default magic tests, if any */ - switch (def_position_tests()) { + switch (def_position_tests(file)) { case -1: /* error */ fd_cleanup(); return (1); @@ -594,7 +618,7 @@ */ static int -def_position_tests(void) +def_position_tests(char *file) { Elf *elf; @@ -605,7 +629,7 @@ if (fbuf[0] == '#' && fbuf[1] == '!' && shellscript(fbuf+2, &mbuf)) return (1); if ((elf = is_elf_file(elffd)) != NULL) { - (void) elf_check(elf); + (void) elf_check(elf, file); (void) elf_end(elf); (void) putchar('\n'); return (1); @@ -1165,7 +1189,7 @@ } static int -print_cap(Elf *elf, GElf_Ehdr *ehdr) +print_cap(Elf *elf, GElf_Ehdr *ehdr, char *file) { Elf_Scn *scn = 0; @@ -1179,8 +1203,9 @@ Elf_Data *data; if (gelf_getshdr(scn, &shdr) == 0) { - (void) fprintf(stderr, - gettext("can't read ELF section header\n")); + (void) fprintf(stderr, gettext("%s: %s: can't read " + "ELF section header - ELF capabilities ignored\n"), + File, file); return (1); } if (shdr.sh_type != SHT_SUNW_cap) @@ -1190,19 +1215,28 @@ * Get the data associated with the .cap section. */ if ((data = elf_getdata(scn, 0)) == 0) { - (void) fprintf(stderr, - gettext("can't read ELF section data\n")); + (void) fprintf(stderr, gettext("%s: %s: can't read " + "ELF section data - ELF capabilities ignored\n"), + File, file); return (1); } + if ((shdr.sh_size == 0) || (shdr.sh_entsize == 0)) { + (void) fprintf(stderr, gettext("%s: %s zero size or " + "zero entry ELF section - ELF capabilities " + "ignored\n"), File, file); + return (1); + } capn = (GElf_Word)(shdr.sh_size / shdr.sh_entsize); + for (ndx = 0; ndx < capn; ndx++) { char str[100]; GElf_Cap cap; if (gelf_getcap(data, ndx, &cap) == NULL) { - (void) fprintf(stderr, - gettext("can't read capabilities data\n")); + (void) fprintf(stderr, gettext("%s: %s: can't " + "read ELF capabilities data - ELF " + "capabilities ignored\n"), File, file); return (1); } if (cap.c_tag != CA_SUNW_NULL) { @@ -1216,7 +1250,7 @@ } static int -elf_check(Elf *elf) +elf_check(Elf *elf, char *file) { GElf_Ehdr ehdr; GElf_Phdr phdr; @@ -1225,10 +1259,11 @@ size_t size; /* - * verify information in file header + * Verify information in file header. */ if (gelf_getehdr(elf, &ehdr) == (GElf_Ehdr *)0) { - (void) fprintf(stderr, gettext("can't read ELF header\n")); + (void) fprintf(stderr, gettext("%s: %s: can't read ELF " + "header\n"), File, file); return (1); } ident = elf_getident(elf, &size); @@ -1242,30 +1277,31 @@ gettext("Version"), (int)ehdr.e_version); print_elf_flags(ehdr.e_machine, ehdr.e_flags); - if (core(elf, &ehdr, ident[EI_DATA])) /* check for core file */ + if (core(elf, &ehdr, ident[EI_DATA], file)) /* check for core file */ return (0); - if (print_cap(elf, &ehdr)) + if (print_cap(elf, &ehdr, file)) return (1); /* - * check type + * Check type. */ if ((ehdr.e_type != ET_EXEC) && (ehdr.e_type != ET_DYN)) return (1); /* - * read program header and check for dynamic section + * Read program header and check for dynamic section. */ if (ehdr.e_phnum == 0) { - (void) fprintf(stderr, gettext("can't read program header\n")); + (void) fprintf(stderr, gettext("%s: %s: no ELF program headers " + "exist\n"), File, file); return (1); } for (dynamic = 0, cnt = 0; cnt < (int)ehdr.e_phnum; cnt++) { if (gelf_getphdr(elf, cnt, &phdr) == NULL) { - (void) fprintf(stderr, - gettext("can't read program header\n")); + (void) fprintf(stderr, gettext("%s: %s: can't read " + "ELF program header\n"), File, file); return (1); } if (phdr.p_type == PT_DYNAMIC) { @@ -1618,7 +1654,7 @@ * If it's a core file, print out the name of the file that dumped core. */ static int -core(Elf *elf, GElf_Ehdr *ehdr, int format) +core(Elf *elf, GElf_Ehdr *ehdr, int format, char *file) { register int inx; char *psinfo; @@ -1631,19 +1667,20 @@ return (0); for (inx = 0; inx < (int)ehdr->e_phnum; inx++) { if (gelf_getphdr(elf, inx, &phdr) == NULL) { - (void) fprintf(stderr, - gettext("can't read program header\n")); + (void) fprintf(stderr, gettext("%s: %s: can't read " + "ELF program header\n"), File, file); return (0); } if (phdr.p_type == PT_NOTE) { char *fname; size_t size; + /* * If the next segment is also a note, use it instead. */ if (gelf_getphdr(elf, inx+1, &nphdr) == NULL) { - (void) fprintf(stderr, - gettext("can't read program header\n")); + (void) fprintf(stderr, gettext("%s: %s: can't " + "read ELF program header\n"), File, file); return (0); } if (nphdr.p_type == PT_NOTE) @@ -1651,6 +1688,7 @@ offset = (off_t)phdr.p_offset; (void) pread(ifd, &nhdr, sizeof (GElf_Nhdr), offset); convert_gelf_nhdr(elf, &nhdr, ehdr->e_version, format); + /* * Note: the ABI states that n_namesz must * be rounded up to a 4 byte boundary. @@ -1658,8 +1696,14 @@ offset += sizeof (GElf_Nhdr) + ((nhdr.n_namesz + 0x03) & ~0x3); size = nhdr.n_descsz; - psinfo = malloc(size); + if ((psinfo = malloc(size)) == NULL) { + int err = errno; + (void) fprintf(stderr, gettext("%s: malloc " + "failed: %s\n"), File, strerror(err)); + exit(2); + } (void) pread(ifd, psinfo, size, offset); + /* * We want to print the string contained * in psinfo->pr_fname[], where 'psinfo' @@ -1952,8 +1996,10 @@ const char *msg_locale = setlocale(LC_MESSAGES, NULL); struct stat statbuf; - if ((dfile = (char *)malloc(strlen(msg_locale) + 35)) == NULL) { - perror("file"); + if ((dfile = malloc(strlen(msg_locale) + 35)) == NULL) { + int err = errno; + (void) fprintf(stderr, gettext("%s: malloc failed: %s\n"), + File, strerror(err)); exit(2); } (void) snprintf(dfile, strlen(msg_locale) + 35, @@ -1993,9 +2039,10 @@ } if (mlist == NULL) { /* initial mlist allocation */ - if ((mlist = (char **)calloc(MLIST_SZ, sizeof (char *))) - == NULL) { - perror("file"); + if ((mlist = calloc(MLIST_SZ, sizeof (char *))) == NULL) { + int err = errno; + (void) fprintf(stderr, gettext("%s: malloc " + "failed: %s\n"), File, strerror(err)); exit(2); } mlist_sz = MLIST_SZ; @@ -2004,9 +2051,11 @@ if ((mlistp - mlist) >= mlist_sz) { mlistp_off = mlistp - mlist; mlist_sz *= 2; - if ((mlist = (char **)realloc(mlist, + if ((mlist = realloc(mlist, mlist_sz * sizeof (char *))) == NULL) { - perror("file"); + int err = errno; + (void) fprintf(stderr, gettext("%s: malloc " + "failed: %s\n"), File, strerror(err)); exit(2); } mlistp = mlist + mlistp_off; @@ -2016,7 +2065,9 @@ * magic file name string */ if ((*mlistp = malloc(strlen(magic_file) + 1)) == NULL) { - perror("file"); + int err = errno; + (void) fprintf(stderr, gettext("%s: malloc failed: %s\n"), + File, strerror(err)); exit(2); } (void) strlcpy(*mlistp, magic_file, strlen(magic_file) + 1);
--- a/usr/src/cmd/file/magicutils.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/file/magicutils.c Mon Jan 22 19:26:57 2007 -0800 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -20,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -94,6 +93,9 @@ const char *e_str; }; +/* Non-localized string giving name of command. Defined in file.c */ +extern const char *File; + typedef struct entry Entry; static Entry *mtab1; /* 1st magic table, applied before default tests */ @@ -111,7 +113,7 @@ static Entry *ep2; /* current entry in mtab2 */ static char * -getstr(char *p) +getstr(char *p, char *file) { char *newstr; char *s; @@ -120,7 +122,9 @@ newstr = (char *)malloc((strlen(p) + 1) * sizeof (char)); if (newstr == NULL) { - perror(gettext("magic table string allocation")); + int err = errno; + (void) fprintf(stderr, gettext("%s: malloc failed: %s\n"), + File, strerror(err)); return (NULL); } @@ -143,8 +147,9 @@ errno = 0; val = strtol(p, &p, base); if (val > UCHAR_MAX || val < 0 || errno != 0) { - perror(gettext("magic table invalid " - "string value")); + (void) fprintf(stderr, gettext("%s: %s: magic " + "table invalid string value\n"), File, + file); return (NULL); } *s++ = (char)val; @@ -238,10 +243,10 @@ /* mtab may have been allocated on a previous f_mkmtab call */ if (mtab == (Entry *)NULL) { - mtab = (Entry *) calloc(sizeof (Entry), NENT); - if (mtab == (Entry *)NULL) { - (void) fprintf(stderr, - gettext("no memory for magic table\n")); + if ((mtab = calloc(sizeof (Entry), NENT)) == NULL) { + int err = errno; + (void) fprintf(stderr, gettext("%s: malloc " + "failed: %s\n"), File, strerror(err)); return (-1); } @@ -249,11 +254,11 @@ mend = &mtab[NENT]; } - fp = fopen(magfile, "r"); - if (fp == NULL) { - (void) fprintf(stderr, - gettext("cannot open magic file <%s>.\n"), - magfile); + errno = 0; + if ((fp = fopen(magfile, "r")) == NULL) { + int err = errno; + (void) fprintf(stderr, gettext("%s: %s: cannot open magic " + "file: %s\n"), File, magfile, err ? strerror(err) : ""); return (-1); } while (fgets(buf, BSZ, fp) != NULL) { @@ -270,7 +275,9 @@ oldsize = mend - mtab; tbsize = (NENT + oldsize) * sizeof (Entry); if ((mtab = realloc(mtab, tbsize)) == NULL) { - perror(gettext("magic table overflow")); + int err = errno; + (void) fprintf(stderr, gettext("%s: malloc " + "failed: %s\n"), File, strerror(err)); return (-1); } else { (void) memset(mtab + oldsize, 0, @@ -294,9 +301,9 @@ p2 = strchr(p, '\t'); if (p2 == NULL) { if (cflg) - (void) fprintf(stderr, - gettext("fmt error, no tab after %s on " - "line %d of %s\n"), p, lcnt, magfile); + (void) fprintf(stderr, gettext("%s: %s: format " + "error, no tab after %s on line %d\n"), + File, magfile, p, lcnt); continue; } *p2++ = NULL; @@ -308,9 +315,9 @@ p2 = strchr(p, '\t'); if (p2 == NULL) { if (cflg) - (void) fprintf(stderr, - gettext("fmt error, no tab after %s on " - "line %d of %s\n"), p, lcnt, magfile); + (void) fprintf(stderr, gettext("%s: %s: format " + "error, no tab after %s on line %d\n"), + File, magfile, p, lcnt); continue; } *p2++ = NULL; @@ -440,9 +447,9 @@ p2 = strchr(p, '\t'); if (p2 == NULL) { if (cflg) - (void) fprintf(stderr, - gettext("fmt error, no tab after %s on " - "line %d of %s\n"), p, lcnt, magfile); + (void) fprintf(stderr, gettext("%s: %s: format " + "error, no tab after %s on line %d\n"), + File, magfile, p, lcnt); continue; } *p2++ = NULL; @@ -480,14 +487,17 @@ if (ep->e_type != STR) { ep->e_value.num = strtoull((const char *)p, (char **)NULL, 0); - } else if ((ep->e_value.str = getstr(p)) == NULL) { + } else if ((ep->e_value.str = + getstr(p, magfile)) == NULL) { return (-1); } } p2 += strspn(p2, "\t"); /* STRING */ if ((ep->e_str = strdup(p2)) == NULL) { - perror(gettext("magic table message allocation")); + int err = errno; + (void) fprintf(stderr, gettext("%s: malloc " + "failed: %s\n"), File, strerror(err)); return (-1); } else { if ((p = strchr(ep->e_str, '\n')) != NULL) @@ -508,8 +518,10 @@ mend2 = mend; ep2 = ep; } - if (fclose(fp) == EOF) { - perror(magfile); + if (fclose(fp) != 0) { + int err = errno; + (void) fprintf(stderr, gettext("%s: fclose failed: %s\n"), + File, strerror(err)); return (-1); } return (0);
--- a/usr/src/cmd/sgs/elfdump/common/elfdump.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/elfdump/common/elfdump.c Mon Jan 22 19:26:57 2007 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" @@ -50,6 +50,9 @@ static Cache *osec = 0; static int nostr; + if (strsec->c_data == NULL) + return (NULL); + const char *strs = (char *)strsec->c_data->d_buf; Word strn = strsec->c_data->d_size; @@ -149,11 +152,17 @@ file, cache[ndx].c_name, EC_WORD(shdr->sh_link)); return (0); } + if ((shdr->sh_entsize == 0) || (shdr->sh_size == 0)) { + (void) fprintf(stderr, MSG_INTL(MSG_ERR_BADSZ), + file, cache[ndx].c_name); + return (0); + } /* * Obtain, and verify the symbol table data. */ - if (cache[ndx].c_data->d_buf == 0) { + if ((cache[ndx].c_data == NULL) || + (cache[ndx].c_data->d_buf == NULL)) { (void) fprintf(stderr, MSG_INTL(MSG_ERR_BADSZ), file, cache[ndx].c_name); return (0); @@ -213,6 +222,9 @@ file, symtab->c_name); return (0); } + if (symtab->c_data == NULL) + return (0); + /* LINTED */ symn = (Word)(shdr->sh_size / shdr->sh_entsize); syms = (Sym *)symtab->c_data->d_buf; @@ -388,6 +400,9 @@ if (name && strcmp(name, _cache->c_name)) continue; + if (_cache->c_data == NULL) + continue; + dbg_print(0, MSG_ORIG(MSG_STR_EMPTY)); dbg_print(0, MSG_INTL(MSG_ELF_SCN_UNWIND), _cache->c_name); @@ -616,8 +631,8 @@ Elf *elf) { Word cnt; - Shdr * cshdr = 0; - Cache * ccache; + Shdr *cshdr = 0; + Cache *ccache; Off cphdr_off = 0; Xword cphdr_sz; @@ -655,6 +670,9 @@ (cphdr_off + cphdr_sz) > (shdr->sh_offset + shdr->sh_size))) continue; + if (_cache->c_data == NULL) + continue; + ccache = _cache; cshdr = shdr; break; @@ -663,12 +681,18 @@ if ((cshdr == 0) && (cphdr_off == 0)) return; + if ((cshdr->sh_entsize == 0) || (cshdr->sh_size == 0)) { + (void) fprintf(stderr, MSG_INTL(MSG_ERR_BADSZ), + file, ccache->c_name); + return; + } + /* * Print the hardware/software capabilities section. */ if (cshdr) { Word ndx, capn; - Cap *cap = (Cap *)ccache->c_data->d_buf; + Cap *cap = (Cap *)ccache->c_data->d_buf; dbg_print(0, MSG_ORIG(MSG_STR_EMPTY)); dbg_print(0, MSG_INTL(MSG_ELF_SCN_CAP), ccache->c_name); @@ -752,7 +776,7 @@ * Print the interpreter string based on the offset defined in the * program header, as this is the offset used by the kernel. */ - if (ishdr) { + if (ishdr && icache->c_data) { dbg_print(0, MSG_ORIG(MSG_STR_EMPTY)); dbg_print(0, MSG_INTL(MSG_ELF_SCN_INTERP), icache->c_name); dbg_print(0, MSG_ORIG(MSG_FMT_INDENT), @@ -800,6 +824,9 @@ file, infocache->c_name); return; } + if (infocache->c_data == NULL) + return; + infonum = (Word)(infoshdr->sh_size / infoshdr->sh_entsize); info = (Syminfo *)infocache->c_data->d_buf; @@ -811,6 +838,9 @@ file, infocache->c_name, EC_WORD(infoshdr->sh_info)); return; } + if (cache[infoshdr->sh_info].c_data == NULL) + return; + dyns = cache[infoshdr->sh_info].c_data->d_buf; if (dyns == 0) { (void) fprintf(stderr, MSG_INTL(MSG_ERR_BADSZ), @@ -992,7 +1022,8 @@ /* * Determine the version section data and number. */ - if ((ver = (void *)_cache->c_data->d_buf) == 0) { + if ((_cache->c_data == NULL) || + ((ver = (void *)_cache->c_data->d_buf) == NULL)) { (void) fprintf(stderr, MSG_INTL(MSG_ERR_BADSZ), file, secname); continue; @@ -1049,6 +1080,9 @@ ((symn = (uint_t)(shdr->sh_size / shdr->sh_entsize)) == 0)) continue; + if (_cache->c_data == NULL) + continue; + *shxndx = _cache->c_data->d_buf; *symnshxndx = symn; return (0); @@ -1108,6 +1142,9 @@ file, secname); continue; } + if (_cache->c_data == NULL) + continue; + /* LINTED */ symn = (Word)(shdr->sh_size / shdr->sh_entsize); sym = (Sym *)_cache->c_data->d_buf; @@ -1125,7 +1162,8 @@ * Determine if there is a associated Versym section * with this Symbol Table. */ - if (versymcache && (versymcache->c_shdr->sh_link == seccnt)) + if (versymcache && (versymcache->c_shdr->sh_link == seccnt) && + versymcache->c_data) versym = versymcache->c_data->d_buf; else versym = 0; @@ -1319,6 +1357,9 @@ file, relname); continue; } + if (_cache->c_data == NULL) + continue; + rels = _cache->c_data->d_buf; relnum = shdr->sh_size / relsize; @@ -1428,6 +1469,14 @@ if (stringtbl(cache, 0, cnt, shnum, file, 0, 0, &strsec) == 0) continue; + if ((shdr->sh_entsize == 0) || (shdr->sh_size == 0)) { + (void) fprintf(stderr, MSG_INTL(MSG_ERR_BADSZ), + file, _cache->c_name); + continue; + } + if (_cache->c_data == NULL) + continue; + numdyn = shdr->sh_size / shdr->sh_entsize; dyn = (Dyn *)_cache->c_data->d_buf; @@ -1505,6 +1554,9 @@ file, _cache->c_name); continue; } + if (_cache->c_data == NULL) + continue; + move = (Move *)_cache->c_data->d_buf; movenum = shdr->sh_size / shdr->sh_entsize; @@ -1757,6 +1809,8 @@ file, _cache->c_name); continue; } + if (_cache->c_data == NULL) + continue; dbg_print(0, MSG_ORIG(MSG_STR_EMPTY)); dbg_print(0, MSG_INTL(MSG_ELF_SCN_NOTE), _cache->c_name); @@ -1844,6 +1898,9 @@ file, hsecname); continue; } + if (_cache->c_data == NULL) + continue; + hash = (uint_t *)_cache->c_data->d_buf; bkts = *hash; chain = hash + 2 + bkts; @@ -1861,7 +1918,10 @@ _cache = &cache[hshdr->sh_link]; ssecname = _cache->c_name; - if ((syms = (Sym *)_cache->c_data->d_buf) == 0) { + if (_cache->c_data == NULL) + continue; + + if ((syms = (Sym *)_cache->c_data->d_buf) == NULL) { (void) fprintf(stderr, MSG_INTL(MSG_ERR_BADSZ), file, ssecname); continue; @@ -1969,8 +2029,8 @@ continue; if (name && strcmp(name, _cache->c_name)) continue; - if ((_cache->c_data == 0) || - ((grpdata = (Word *)_cache->c_data->d_buf) == 0)) + if ((_cache->c_data == NULL) || + ((grpdata = (Word *)_cache->c_data->d_buf) == NULL)) continue; grpcnt = shdr->sh_size / sizeof (Word); @@ -2086,6 +2146,9 @@ if ((gentsize = gotshdr->sh_entsize) == 0) gentsize = sizeof (Xword); + if (gotcache->c_data == NULL) + return; + /* LINTED */ gotents = (Word)(gotshdr->sh_size / gentsize); gotdata = gotcache->c_data->d_buf; @@ -2146,6 +2209,9 @@ file, _cache->c_name); continue; } + if (_cache->c_data == NULL) + continue; + rels = _cache->c_data->d_buf; relnum = shdr->sh_size / relsize; @@ -2427,7 +2493,8 @@ /* * Do we wish to write the section out? */ - if (wfd && Nname && (strcmp(Nname, _cache->c_name) == 0)) { + if (wfd && Nname && (strcmp(Nname, _cache->c_name) == 0) && + _cache->c_data) { (void) write(wfd, _cache->c_data->d_buf, _cache->c_data->d_size); }
--- a/usr/src/cmd/sgs/include/libld.h Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/include/libld.h Mon Jan 22 19:26:57 2007 -0800 @@ -23,7 +23,7 @@ * Copyright (c) 1988 AT&T * All Rights Reserved * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -189,8 +189,8 @@ Word ofl_regsymcnt; /* no. of output register symbols */ Word ofl_lregsymcnt; /* no. of local register symbols */ Sym_desc *ofl_dtracesym; /* ld -zdtrace= */ - Word ofl_flags; /* various state bits, args etc. */ - Word ofl_flags1; /* more flags */ + Lword ofl_flags; /* various state bits, args etc. */ + Lword ofl_flags1; /* more flags */ Xword ofl_segorigin; /* segment origin (start) */ void *ofl_entry; /* entry point (-e and Sym_desc *) */ char *ofl_filtees; /* shared objects we are a filter for */ @@ -316,6 +316,9 @@ #define FLG_OF_WARN 0x40000000 /* warning during input processing. */ #define FLG_OF_VERBOSE 0x80000000 /* -z verbose flag set */ +#define FLG_OF_MAPSYMB 0x000100000000 /* symbolic scope definition seen */ +#define FLG_OF_MAPGLOB 0x000200000000 /* global scope definition seen */ + /* * In the flags1 arena, establish any options that are applicable to archive * extraction first, and associate a mask. These values are recorded with any @@ -781,7 +784,7 @@ #define FLG_SY_REFRSD 0x00000400 /* symbols sd_ref has been raised */ /* due to a copy-relocs */ /* weak-strong pairing */ - +#define FLG_SY_INTPOSE 0x00000800 /* symbol defines an interposer */ #define FLG_SY_INVALID 0x00001000 /* unwanted/erroneous symbol */ #define FLG_SY_SMGOT 0x00002000 /* small got index assigned to symbol */ /* sparc only */
--- a/usr/src/cmd/sgs/include/rtld.h Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/include/rtld.h Mon Jan 22 19:26:57 2007 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -655,9 +655,11 @@ #define FLG_RT_NOOPEN 0x00100000 /* dlopen() not allowed */ #define FLG_RT_FINICLCT 0x00200000 /* fini has been collected (tsort) */ #define FLG_RT_INITCALL 0x00400000 /* objects .init has been called */ -#define FLG_RT_INTRPOSE 0x00800000 /* object is an INTERPOSER */ -#define FLG_RT_DIRECT 0x01000000 /* object has DIRECT bindings enabled */ -#define FLG_RT_SUNWBSS 0x02000000 /* object with PT_SUNWBSS, not mapped */ +#define FLG_RT_SUNWBSS 0x00800000 /* object with PT_SUNWBSS, not mapped */ +#define FLG_RT_OBJINTPO 0x01000000 /* object is a global interposer */ +#define FLG_RT_SYMINTPO 0x02000000 /* object contains symbol interposer */ +#define MSK_RT_INTPOSE 0x03000000 /* mask for all interposer */ + /* possibilities */ #define FLG_RT_MOVE 0x04000000 /* object needs move operation */ #define FLG_RT_DLSYM 0x08000000 /* dlsym in progress on object */ #define FLG_RT_REGSYMS 0x10000000 /* object has DT_REGISTER entries */ @@ -686,6 +688,7 @@ #define FL1_RT_TLSADD 0x00010000 /* objects TLS has been registered */ #define FL1_RT_TLSSTAT 0x00020000 /* object requires static TLS */ +#define FL1_RT_DIRECT 0x00040000 /* object has DIRECT bindings enabled */ /* * The following range of bits are reserved to hold LML_TFLG_AUD_ values
--- a/usr/src/cmd/sgs/lari/lari.pl Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/lari/lari.pl Mon Jan 22 19:26:57 2007 -0800 @@ -21,7 +21,7 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -90,7 +90,7 @@ $Sfte = 0x00002; # symbol is a filtee backing a standard filter $Afte = 0x00004; # symbol is a filtee backing a auxiliary filter $Gfte = 0x00008; # symbol bound as a filtee -$Intp = 0x00010; # symbol originates for explicit interposer +$Intp = 0x00010; # symbol originates from explicit interposer $Dirc = 0x00020; # symbol bound to directly $Cpyr = 0x00040; # symbol bound to copy-relocation reference $Prot = 0x00080; # symbol is protected (symbolic) @@ -1284,7 +1284,7 @@ # Determine whether this object is an interposer. if (($Fields[1] eq 'FLAGS_1') && - ($Line =~ / INTERPOSE /)) { + ($Line =~ / OBJECT-INTERPOSE /)) { $Interpose = 1; next; } @@ -1342,6 +1342,9 @@ if ($Fields[1] =~ /A/) { $Flags |= $Saft; } + if ($Fields[1] =~ /I/) { + $Flags |= $Intp; + } # Determine the symbol name based upon the number of # fields. @@ -1354,7 +1357,7 @@ # If this is a filter, we need to tag the associated # filtee symbol. However, the filtee might not have # been processed yet, so save this information for later. - $Flags &= ~$Nodi; + $Flags &= ~($Nodi | $Intp); if ($Flags) { my ($Filtee) = $Fields[$#Fields - 1];
--- a/usr/src/cmd/sgs/libconv/common/dynamic.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/libconv/common/dynamic.c Mon Jan 22 19:26:57 2007 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" @@ -128,8 +128,9 @@ MSG_DF1_NODIRECT_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \ MSG_DF1_IGNMULDEF_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \ MSG_DF1_NOKSYMS_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \ + MSG_DF1_NOHDR_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \ MSG_DF1_NORELOC_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \ - MSG_DF1_NOHDR_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \ + MSG_DF1_SYMINTPOSE_SIZE + CONV_EXPN_FIELD_DEF_SEP_SIZE + \ CONV_INV_STRSIZE + CONV_EXPN_FIELD_DEF_SUFFIX_SIZE const char * @@ -157,8 +158,9 @@ { DF_1_NODIRECT, MSG_ORIG(MSG_DF1_NODIRECT) }, { DF_1_IGNMULDEF, MSG_ORIG(MSG_DF1_IGNMULDEF) }, { DF_1_NOKSYMS, MSG_ORIG(MSG_DF1_NOKSYMS) }, + { DF_1_NOHDR, MSG_ORIG(MSG_DF1_NOHDR) }, { DF_1_NORELOC, MSG_ORIG(MSG_DF1_NORELOC) }, - { DF_1_NOHDR, MSG_ORIG(MSG_DF1_NOHDR) }, + { DF_1_SYMINTPOSE, MSG_ORIG(MSG_DF1_SYMINTPOSE) }, { 0, 0 } }; static CONV_EXPN_FIELD_ARG conv_arg = { string, sizeof (string), vda };
--- a/usr/src/cmd/sgs/libconv/common/dynamic.msg Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/libconv/common/dynamic.msg Mon Jan 22 19:26:57 2007 -0800 @@ -20,7 +20,7 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -108,7 +108,7 @@ @ MSG_DF1_NODELETE "NODELETE" @ MSG_DF1_LOADFLTR "LOADFLTR" @ MSG_DF1_INITFIRST "INITFIRST" -@ MSG_DF1_INTERPOSE "INTERPOSE" +@ MSG_DF1_INTERPOSE "OBJECT-INTERPOSE" @ MSG_DF1_NOOPEN "NOOPEN" @ MSG_DF1_ORIGIN "ORIGIN" @ MSG_DF1_DIRECT "DIRECT" @@ -122,8 +122,9 @@ @ MSG_DF1_NODIRECT "NODIRECT" @ MSG_DF1_IGNMULDEF "IGNMULDEF" @ MSG_DF1_NOKSYMS "NOKSYMS" +@ MSG_DF1_NOHDR "NOHDR" @ MSG_DF1_NORELOC "NORELOC" -@ MSG_DF1_NOHDR "NOHDR" +@ MSG_DF1_SYMINTPOSE "SYMBOL-INTERPOSE" @ MSG_DFP_LAZYLOAD "LAZY" @ MSG_DFP_LAZYLOAD_ALT "LAZYLOAD"
--- a/usr/src/cmd/sgs/libld/common/args.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/libld/common/args.c Mon Jan 22 19:26:57 2007 -0800 @@ -23,7 +23,7 @@ * Copyright (c) 1988 AT&T * All Rights Reserved * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" @@ -383,13 +383,23 @@ ofl->ofl_flags |= FLG_OF_SHAROBJ; /* - * By default we print relocation errors for - * executables but *not* for a shared object + * By default, print text relocation errors for + * executables but *not* for shared objects. */ if (ztflag == 0) ofl->ofl_flags1 |= FLG_OF1_TEXTOFF; if (Bsflag) { + /* + * -Bsymbolic, and -Bnodirect make no sense. + */ + if (Bdflag == SET_FALSE) { + eprintf(ofl->ofl_lml, ERR_FATAL, + MSG_INTL(MSG_ARG_INCOMP), + MSG_ORIG(MSG_ARG_BSYMBOLIC), + MSG_ORIG(MSG_ARG_BNODIRECT)); + ofl->ofl_flags |= FLG_OF_FATAL; + } ofl->ofl_flags |= FLG_OF_SYMBOLIC; ofl->ofl_dtflags |= DF_SYMBOLIC; } @@ -544,6 +554,19 @@ } /* + * If a mapfile has been used to define a single symbolic scope of + * interfaces, -Bsymbolic is established. This global setting goes + * beyond individual symbol protection, and ensures all relocations + * (even those that reference section symbols) are processed within + * the object being built. + */ + if ((ofl->ofl_flags & + (FLG_OF_MAPSYMB | FLG_OF_MAPGLOB)) == FLG_OF_MAPSYMB) { + ofl->ofl_flags |= FLG_OF_SYMBOLIC; + ofl->ofl_dtflags |= DF_SYMBOLIC; + } + + /* * If -zloadfltr is set, verify that filtering is in effect. Filters * are either established from the command line, and affect the whole * object, or are set on a per-symbol basis from a mapfile.
--- a/usr/src/cmd/sgs/libld/common/libld.msg Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/libld/common/libld.msg Mon Jan 22 19:26:57 2007 -0800 @@ -20,7 +20,7 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -858,8 +858,8 @@ a non-existent segment `%s'" @ MSG_MAP_INCOMFLG "%s: %lld: incompatible flags $SPECVERS and $ADDVERS \ used on the same object `%s'" -@ MSG_MAP_MULSONAME "%s: %lld: multiple definition of SONAME field for %s\ - \n\tfirst `%s', second `%s'; first value used" +@ MSG_MAP_MULSONAME "%s: %lld: multiple definition of SONAME field for %s: \ + first `%s', second `%s'; first value used" @ MSG_MAP_UNEXDEP "%s: %lld: dependency `%s' unexpected; ignored" @ MSG_MAP_UNEXTOK "%s: %lld: unexpected occurrence of `%c' token" @@ -907,6 +907,10 @@ @ MSG_MAP_NOFILTER "%s: %lld: filtee definition required" @ MSG_MAP_BADSF1 "%s: %lld: unknown software capabilities: 0x%llx; \ ignored" +@ MSG_MAP_NOINTPOSE "%s: %lld: interposition symbols can only be defined \ + when building a dynamic executable" +@ MSG_MAP_PROTNDIR "%s: %lld: protected scope and no-direct declaration \ + are incompatible" @ MSG_MAP_SEGSAME "segments `%s' and `%s' have the same assigned \ virtual address" @@ -928,8 +932,8 @@ @ MSG_MAP_SYMVAL "symbol value" @ MSG_MAP_SYMSIZE "symbol size" -@ MSG_MAP_SECORDER "section ordering set but no matching section found;\ - \n\tsegment: %s section: %s" +@ MSG_MAP_SECORDER "section ordering requested, but no matching section \ + found: segment: %s section: %s" # Generic error diagnostic labels @@ -1141,6 +1145,7 @@ @ MSG_MAP_FILTER "filter" @ MSG_MAP_AUXILIARY "auxiliary" @ MSG_MAP_OVERRIDE "override" +@ MSG_MAP_INTERPOSE "interpose" @ MSG_FMT_INDEX "[%lld]"
--- a/usr/src/cmd/sgs/libld/common/map.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/libld/common/map.c Mon Jan 22 19:26:57 2007 -0800 @@ -23,7 +23,7 @@ * Copyright (c) 1988 AT&T * All Rights Reserved * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" @@ -1430,22 +1430,27 @@ /* * Establish a new scope. All symbols added by this * mapfile are actually global entries. They will be - * reduced to locals during sym_update(). + * reduced to locals during sym_update(). If a symbolic + * scope is detected, remember this. If a symbolic + * scope is the only scope defined in this (or any other + * mapfiles), then -Bsymbolic is established. */ if ((strcmp(MSG_ORIG(MSG_STR_LOCAL), _name) == 0) || - (strcmp(MSG_ORIG(MSG_MAP_HIDDEN), _name) == 0)) + (strcmp(MSG_ORIG(MSG_MAP_HIDDEN), _name) == 0)) { scope = FLG_SCOPE_LOCL; - else if ((strcmp(MSG_ORIG(MSG_MAP_GLOBAL), + } else if ((strcmp(MSG_ORIG(MSG_MAP_GLOBAL), _name) == 0) || - (strcmp(MSG_ORIG(MSG_MAP_DEFAULT), _name) == 0)) + (strcmp(MSG_ORIG(MSG_MAP_DEFAULT), _name) == 0)) { scope = FLG_SCOPE_GLOB; - else if ((strcmp(MSG_ORIG(MSG_STR_SYMBOLIC), + ofl->ofl_flags |= FLG_OF_MAPGLOB; + } else if ((strcmp(MSG_ORIG(MSG_STR_SYMBOLIC), _name) == 0) || - (strcmp(MSG_ORIG(MSG_MAP_PROTECTED), _name) == 0)) + (strcmp(MSG_ORIG(MSG_MAP_PROTECTED), _name) == 0)) { scope = FLG_SCOPE_SYMB; - else if (strcmp(MSG_ORIG(MSG_STR_ELIMINATE), _name) - == 0) + ofl->ofl_flags |= FLG_OF_MAPSYMB; + } else if (strcmp(MSG_ORIG(MSG_STR_ELIMINATE), + _name) == 0) scope = FLG_SCOPE_ELIM; else { eprintf(ofl->ofl_lml, ERR_FATAL, @@ -1570,6 +1575,13 @@ ofl->ofl_flags |= FLG_OF_SYMINFO; } else if (strcmp(Start_tok, MSG_ORIG(MSG_MAP_NODIRECT)) == 0) { + if (scope == FLG_SCOPE_SYMB) { + eprintf(ofl->ofl_lml, ERR_FATAL, + MSG_INTL(MSG_MAP_PROTNDIR), + mapfile, + EC_XWORD(Line_num)); + return (S_ERROR); + } sym_flags1 |= FLG_SY1_NDIR; ofl->ofl_flags |= FLG_OF_SYMINFO; ofl->ofl_flags1 |= FLG_OF1_NDIRECT; @@ -1586,6 +1598,19 @@ sym_flags |= FLG_SY_AUXFLTR; ofl->ofl_flags |= FLG_OF_SYMINFO; continue; + } else if (strcmp(Start_tok, + MSG_ORIG(MSG_MAP_INTERPOSE)) == 0) { + if (!(ofl->ofl_flags & FLG_OF_EXEC)) { + eprintf(ofl->ofl_lml, ERR_FATAL, + MSG_INTL(MSG_MAP_NOINTPOSE), + mapfile, + EC_XWORD(Line_num)); + return (S_ERROR); + } + sym_flags |= FLG_SY_INTPOSE; + ofl->ofl_flags |= FLG_OF_SYMINFO; + ofl->ofl_dtflags_1 |= DF_1_SYMINTPOSE; + continue; } else { eprintf(ofl->ofl_lml, ERR_FATAL, MSG_INTL(MSG_MAP_UNKSYMDEF), @@ -1602,7 +1627,7 @@ * specified in local scope and indicates that all * symbols processed that are not explicitly defined to * be global are to be reduced to local scope in the - * output image. This also applies that a version + * output image. This also implies that a version * definition is created as the user has effectively * defined an interface. */
--- a/usr/src/cmd/sgs/libld/common/relocate.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/libld/common/relocate.c Mon Jan 22 19:26:57 2007 -0800 @@ -23,7 +23,7 @@ * Copyright (c) 1988 AT&T * All Rights Reserved * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" @@ -1115,30 +1115,30 @@ /* * Determine whether this symbol should be bound locally or not. - * Symbols will be bound locally if one of the following is true: + * Symbols are bound locally if one of the following is true: * - * o the symbol is of type STB_LOCAL + * o the symbol is of type STB_LOCAL. * - * o the output image is not a relocatable object and the - * relocation is relative to the .got + * o the output image is not a relocatable object and the relocation + * is relative to the .got. * - * o the section being relocated is of type SHT_SUNW_dof; - * these sections are bound to the functions in the - * containing object and don't care about interpositioning + * o the section being relocated is of type SHT_SUNW_dof. These + * sections must be bound to the functions in the containing + * object and can not be interposed upon. * - * o the symbol has been reduced (scoped to a local or - * symbolic) and reductions are being processed + * o the symbol has been reduced (scoped to a local or symbolic) and + * reductions are being processed. * - * o the -Bsymbolic flag is in use when building a shared - * object or an executable (fixed address) is being created + * o the -Bsymbolic flag is in use when building a shared object, + * and the symbol hasn't explicitly been defined as nodirect. * - * o Building an executable and the symbol is defined - * in the executable. + * o an executable (fixed address) is being created, and the symbol + * is defined in the executable. * - * o the relocation is against a segment which will not - * be loaded into memory. If that is the case we need - * to resolve the relocation now because ld.so.1 won't - * be able to. + * o the relocation is against a segment which will not be loaded + * into memory. In this case, the relocation must be resolved + * now, as ld.so.1 can not process relocations against unmapped + * segments. */ local = FALSE; if (ELF_ST_BIND(sdp->sd_sym->st_info) == STB_LOCAL) { @@ -1153,9 +1153,20 @@ (IS_LOCALBND(rtype) || IS_SEG_RELATIVE(rtype))) { local = TRUE; } else if (sdp->sd_ref == REF_REL_NEED) { + /* + * Global symbols may have been individually reduced in + * scope. If the whole object is to be self contained, + * such as when generating an executable or a symbolic + * shared object, make sure all relocation symbol + * references (sections too) are treated locally. Note, + * explicit no-direct symbols should not be bound to + * locally. + */ if ((sdp->sd_flags1 & (FLG_SY1_LOCL | FLG_SY1_PROT))) local = TRUE; - else if (flags & (FLG_OF_SYMBOLIC | FLG_OF_EXEC)) + else if ((flags & FLG_OF_EXEC) || + ((flags & FLG_OF_SYMBOLIC) && + ((sdp->sd_flags1 & FLG_SY1_NDIR) == 0))) local = TRUE; } } @@ -1871,6 +1882,7 @@ { Listnode *lnp; Is_desc *isp; + Sym_desc *sdp; /* * At this point we have finished processing all input symbols. Make @@ -1919,12 +1931,11 @@ * check the validity of copy relocations. */ if (ofl->ofl_copyrels.head != 0) { - Copy_rel * cpyrel; + Copy_rel *cpyrel; for (LIST_TRAVERSE(&ofl->ofl_copyrels, lnp, cpyrel)) { - Sym_desc * sdp; + sdp = cpyrel->copyrel_symd; - sdp = cpyrel->copyrel_symd; /* * If there were no displacement relocation * in this file, don't worry about it. @@ -1942,10 +1953,10 @@ */ if (((ofl->ofl_flags & FLG_OF_RELOBJ) == 0) && ((ofl->ofl_flags & FLG_OF_BLDGOT) || - (ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL), - SYM_NOHASH, 0, ofl) != 0) || - (ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL_U), - SYM_NOHASH, 0, ofl) != 0))) { + ((((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL), + SYM_NOHASH, 0, ofl)) != 0) || + ((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL_U), + SYM_NOHASH, 0, ofl)) != 0)) && (sdp->sd_ref != REF_DYN_SEEN)))) { if (ld_make_got(ofl) == S_ERROR) return (S_ERROR);
--- a/usr/src/cmd/sgs/libld/common/resolve.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/libld/common/resolve.c Mon Jan 22 19:26:57 2007 -0800 @@ -23,7 +23,7 @@ * Copyright (c) 1988 AT&T * All Rights Reserved * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" /* SVR4 6.2/18.2 */ @@ -252,11 +252,13 @@ sdp->sd_aux->sa_rfile = ifl->ifl_name; } else { /* - * Under -Bnodirect, all exported interfaces are tagged - * to prevent direct binding to them. + * Under -Bnodirect, all exported interfaces that have + * not explicitly been defined protected or directly + * bound to, are tagged to prevent direct binding. */ if ((ofl->ofl_flags1 & FLG_OF1_ALNODIR) && - ((sdp->sd_flags1 & FLG_SY1_DIR) == 0)) + ((sdp->sd_flags1 & + (FLG_SY1_PROT | FLG_SY1_DIR)) == 0)) sdp->sd_flags1 |= FLG_SY1_NDIR; }
--- a/usr/src/cmd/sgs/libld/common/syms.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/libld/common/syms.c Mon Jan 22 19:26:57 2007 -0800 @@ -24,7 +24,7 @@ * All Rights Reserved * * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" @@ -131,7 +131,7 @@ * referenced, mark it so that we don't directly bind to it. */ uintptr_t -ld_sym_nodirect(Is_desc * isp, Ifl_desc * ifl, Ofl_desc * ofl) +ld_sym_nodirect(Is_desc *isp, Ifl_desc *ifl, Ofl_desc *ofl) { Shdr *sifshdr, *symshdr; Syminfo *sifdata; @@ -370,13 +370,15 @@ sdp->sd_ref = REF_REL_NEED; /* - * Under -Bnodirect, all exported interfaces are tagged to - * prevent direct binding to them. + * Under -Bnodirect, all exported interfaces that have not + * explicitly been defined protected or directly bound to, are + * tagged to prevent direct binding. */ if ((ofl->ofl_flags1 & FLG_OF1_ALNODIR) && - (nsym->st_shndx != SHN_UNDEF)) + ((sdp->sd_flags1 & (FLG_SY1_PROT | FLG_SY1_DIR)) == 0) && + (nsym->st_shndx != SHN_UNDEF)) { sdp->sd_flags1 |= FLG_SY1_NDIR; - + } } else { sdp->sd_ref = REF_DYN_SEEN; @@ -552,15 +554,23 @@ usdp->sd_aux->sa_symspec = (Half)sdaux_id; /* - * If a user hasn't specifically indicated the scope of - * this symbol be made local then leave it as global - * (ie. prevent automatic scoping). + * If a user hasn't specifically indicated that the + * scope of this symbol be made local, then leave it + * as global (ie. prevent automatic scoping). The GOT + * should be defined protected, whereas all other + * special symbols are tagged as no-direct. */ if (!(usdp->sd_flags1 & FLG_SY1_LOCL) && (flags1 & FLG_SY1_GLOB)) { - usdp->sd_aux->sa_overndx = VER_NDX_GLOBAL; - if ((usdp->sd_flags1 & FLG_SY1_DIR) == 0) - usdp->sd_flags1 |= FLG_SY1_NDIR; + usdp->sd_aux->sa_overndx = VER_NDX_GLOBAL; + if (sdaux_id == SDAUX_ID_GOT) { + usdp->sd_flags1 &= ~FLG_SY1_NDIR; + usdp->sd_flags1 |= FLG_SY1_PROT; + usdp->sd_sym->st_other = STV_PROTECTED; + } else if (((usdp->sd_flags1 & FLG_SY1_DIR) == 0) && + ((ofl->ofl_flags & FLG_OF_SYMBOLIC) == 0)) { + usdp->sd_flags1 |= FLG_SY1_NDIR; + } } usdp->sd_flags1 |= flags1; @@ -596,8 +606,14 @@ usdp->sd_aux->sa_symspec = (Half)sdaux_id; usdp->sd_aux->sa_overndx = VER_NDX_GLOBAL; - if (flags1 & FLG_SY1_GLOB) + + if (sdaux_id == SDAUX_ID_GOT) { + usdp->sd_flags1 |= FLG_SY1_PROT; + usdp->sd_sym->st_other = STV_PROTECTED; + } else if ((flags1 & FLG_SY1_GLOB) && + ((ofl->ofl_flags & FLG_OF_SYMBOLIC) == 0)) { usdp->sd_flags1 |= FLG_SY1_NDIR; + } usdp->sd_flags1 |= flags1; } @@ -628,15 +644,22 @@ sdp->sd_sym->st_info = ELF_ST_INFO(bind, STT_OBJECT); /* - * If a user hasn't specifically indicated the scope of - * this symbol be made local then leave it as global - * (ie. prevent automatic scoping). + * If a user hasn't specifically indicated the scope of this + * symbol be made local then leave it as global (ie. prevent + * automatic scoping). The GOT should be defined protected, + * whereas all other special symbols are tagged as no-direct. */ if (!(sdp->sd_flags1 & FLG_SY1_LOCL) && (flags1 & FLG_SY1_GLOB)) { sdp->sd_aux->sa_overndx = VER_NDX_GLOBAL; - if ((sdp->sd_flags1 & FLG_SY1_DIR) == 0) + if (sdaux_id == SDAUX_ID_GOT) { + sdp->sd_flags1 &= ~FLG_SY1_NDIR; + sdp->sd_flags1 |= FLG_SY1_PROT; + sdp->sd_sym->st_other = STV_PROTECTED; + } else if (((sdp->sd_flags1 & FLG_SY1_DIR) == 0) && + ((ofl->ofl_flags & FLG_OF_SYMBOLIC) == 0)) { sdp->sd_flags1 |= FLG_SY1_NDIR; + } } sdp->sd_flags1 |= flags1; @@ -745,52 +768,56 @@ uintptr_t ld_sym_spec(Ofl_desc *ofl) { - if (!(ofl->ofl_flags & FLG_OF_RELOBJ)) { + Sym_desc *sdp; - DBG_CALL(Dbg_syms_spec_title(ofl->ofl_lml)); + if (ofl->ofl_flags & FLG_OF_RELOBJ) + return (1); + + DBG_CALL(Dbg_syms_spec_title(ofl->ofl_lml)); - if (sym_add_spec(MSG_ORIG(MSG_SYM_ETEXT), - MSG_ORIG(MSG_SYM_ETEXT_U), SDAUX_ID_ETEXT, - FLG_SY1_GLOB, ofl) == S_ERROR) - return (S_ERROR); - if (sym_add_spec(MSG_ORIG(MSG_SYM_EDATA), - MSG_ORIG(MSG_SYM_EDATA_U), SDAUX_ID_EDATA, - FLG_SY1_GLOB, ofl) == S_ERROR) - return (S_ERROR); - if (sym_add_spec(MSG_ORIG(MSG_SYM_END), - MSG_ORIG(MSG_SYM_END_U), SDAUX_ID_END, + if (sym_add_spec(MSG_ORIG(MSG_SYM_ETEXT), MSG_ORIG(MSG_SYM_ETEXT_U), + SDAUX_ID_ETEXT, FLG_SY1_GLOB, ofl) == S_ERROR) + return (S_ERROR); + if (sym_add_spec(MSG_ORIG(MSG_SYM_EDATA), MSG_ORIG(MSG_SYM_EDATA_U), + SDAUX_ID_EDATA, FLG_SY1_GLOB, ofl) == S_ERROR) + return (S_ERROR); + if (sym_add_spec(MSG_ORIG(MSG_SYM_END), MSG_ORIG(MSG_SYM_END_U), + SDAUX_ID_END, FLG_SY1_GLOB, ofl) == S_ERROR) + return (S_ERROR); + if (sym_add_spec(MSG_ORIG(MSG_SYM_L_END), MSG_ORIG(MSG_SYM_L_END_U), + SDAUX_ID_END, FLG_SY1_LOCL, ofl) == S_ERROR) + return (S_ERROR); + if (sym_add_spec(MSG_ORIG(MSG_SYM_L_START), MSG_ORIG(MSG_SYM_L_START_U), + SDAUX_ID_START, FLG_SY1_LOCL, ofl) == S_ERROR) + return (S_ERROR); + + /* + * Historically we've always produced a _DYNAMIC symbol, even for + * static executables (in which case its value will be 0). + */ + if (sym_add_spec(MSG_ORIG(MSG_SYM_DYNAMIC), MSG_ORIG(MSG_SYM_DYNAMIC_U), + SDAUX_ID_DYN, FLG_SY1_GLOB, ofl) == S_ERROR) + return (S_ERROR); + + if (OFL_ALLOW_DYNSYM(ofl)) { + if (sym_add_spec(MSG_ORIG(MSG_SYM_PLKTBL), + MSG_ORIG(MSG_SYM_PLKTBL_U), SDAUX_ID_PLT, FLG_SY1_GLOB, ofl) == S_ERROR) return (S_ERROR); - if (sym_add_spec(MSG_ORIG(MSG_SYM_L_END), - MSG_ORIG(MSG_SYM_L_END_U), SDAUX_ID_END, - FLG_SY1_LOCL, ofl) == S_ERROR) - return (S_ERROR); - if (sym_add_spec(MSG_ORIG(MSG_SYM_L_START), - MSG_ORIG(MSG_SYM_L_START_U), SDAUX_ID_START, - FLG_SY1_LOCL, ofl) == S_ERROR) - return (S_ERROR); + } - /* - * Historically we've always produced a _DYNAMIC symbol, even - * for static executables (in which case its value will be 0). - */ - if (sym_add_spec(MSG_ORIG(MSG_SYM_DYNAMIC), - MSG_ORIG(MSG_SYM_DYNAMIC_U), SDAUX_ID_DYN, - FLG_SY1_GLOB, ofl) == S_ERROR) + /* + * A GOT reference will be accompanied by the associated GOT symbol. + * Make sure it gets assigned the appropriate special attributes. + */ + if (((sdp = ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL_U), + SYM_NOHASH, 0, ofl)) != 0) && (sdp->sd_ref != REF_DYN_SEEN)) { + if (sym_add_spec(MSG_ORIG(MSG_SYM_GOFTBL), + MSG_ORIG(MSG_SYM_GOFTBL_U), SDAUX_ID_GOT, FLG_SY1_GLOB, + ofl) == S_ERROR) return (S_ERROR); + } - if (OFL_ALLOW_DYNSYM(ofl)) - if (sym_add_spec(MSG_ORIG(MSG_SYM_PLKTBL), - MSG_ORIG(MSG_SYM_PLKTBL_U), SDAUX_ID_PLT, - FLG_SY1_GLOB, ofl) == S_ERROR) - return (S_ERROR); - - if (ld_sym_find(MSG_ORIG(MSG_SYM_GOFTBL_U), SYM_NOHASH, 0, ofl)) - if (sym_add_spec(MSG_ORIG(MSG_SYM_GOFTBL), - MSG_ORIG(MSG_SYM_GOFTBL_U), SDAUX_ID_GOT, - FLG_SY1_GLOB, ofl) == S_ERROR) - return (S_ERROR); - } return (1); } @@ -831,12 +858,13 @@ } /* - * If '-Bsymbolic' is in effect - then bind all global symbols - * 'symbolically' and assign the STV_PROTECTED visibility + * If -Bsymbolic is in effect, and the symbol hasn't explicitly + * been defined nodirect (via a mapfile), then bind the global + * symbol symbolically and assign the STV_PROTECTED visibility * attribute. */ if ((oflags & FLG_OF_SYMBOLIC) && - ((sdp->sd_flags1 & FLG_SY1_LOCL) == 0)) { + ((sdp->sd_flags1 & (FLG_SY1_LOCL | FLG_SY1_NDIR)) == 0)) { sdp->sd_flags1 |= FLG_SY1_PROT; if (ELF_ST_VISIBILITY(sym->st_other) == STV_DEFAULT)
--- a/usr/src/cmd/sgs/libld/common/update.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/libld/common/update.c Mon Jan 22 19:26:57 2007 -0800 @@ -23,7 +23,7 @@ * Copyright (c) 1988 AT&T * All Rights Reserved * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" @@ -1128,10 +1128,12 @@ */ syminfo[ndx].si_boundto = SYMINFO_BT_EXTERN; - } else if (sdp->sd_flags & FLG_SY_PARENT) { + } else if ((sdp->sd_flags & FLG_SY_PARENT) && + (sdp->sd_sym->st_shndx == SHN_UNDEF)) { /* - * A reference to a parent object. Indicate - * whether a direct binding should be + * If this symbol has been explicitly defined + * to be a reference to a parent object, + * indicate whether a direct binding should be * established. */ syminfo[ndx].si_flags |= SYMINFO_FLG_DIRECT; @@ -1166,6 +1168,7 @@ } else if ((sdp->sd_ref == REF_REL_NEED) && (sdp->sd_sym->st_shndx != SHN_UNDEF)) { + /* * This definition exists within the object * being created. Flag whether it is necessary @@ -1179,6 +1182,15 @@ } /* + * Indicate that this symbol is acting as an + * individual interposer. + */ + if (sdp->sd_flags & FLG_SY_INTPOSE) { + syminfo[ndx].si_flags |= + SYMINFO_FLG_INTERPOSE; + } + + /* * If external bindings are allowed, or this is * a translator symbol, indicate the binding, * and a direct binding if necessary. @@ -1262,7 +1274,7 @@ if (_hashndx = hashbkt[hashval]) { while (hashchain[_hashndx]) _hashndx = hashchain[_hashndx]; - hashchain[_hashndx] = sdp->sd_symndx; + hashchain[_hashndx] = sdp->sd_symndx; } else { hashbkt[hashval] = sdp->sd_symndx; }
--- a/usr/src/cmd/sgs/liblddbg/common/liblddbg.msg Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/liblddbg/common/liblddbg.msg Mon Jan 22 19:26:57 2007 -0800 @@ -20,7 +20,7 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -840,9 +840,9 @@ # TRANSLATION_NOTE - the following two entries provide for a series of one or # more symbol information table entries that align with the initial title. -@ MSG_SYMINFO_TITLE " index flags \ +@ MSG_SYMINFO_TITLE " index flags \ bound to symbol" -@ MSG_SYMINFO_ENTRY "%10.10s %-4s %7s %-24s %s" +@ MSG_SYMINFO_ENTRY "%10.10s %-8s %7s %-24s %s" @ MSG_SYMINFO_SELF "<self>" @ MSG_SYMINFO_PARENT "<parent>" @@ -1248,7 +1248,7 @@ # Syminfo formats -@ MSG_SYMINFO_UNKFLAG " 0x%x" +@ MSG_SYMINFO_UNKFLAG "[0x%x]" # Lc_interface interface tags.
--- a/usr/src/cmd/sgs/liblddbg/common/syminfo.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/liblddbg/common/syminfo.c Mon Jan 22 19:26:57 2007 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" @@ -89,12 +89,16 @@ flagstr[flgndx++] = 'N'; flags &= ~SYMINFO_FLG_NOEXTDIRECT; } + if (flags & SYMINFO_FLG_INTERPOSE) { + flagstr[flgndx++] = 'I'; + flags &= ~SYMINFO_FLG_INTERPOSE; + } /* * Did we account for all of the flags? */ if (flags) - (void) snprintf(&flagstr[flgndx], FLAGSZ - ndx, + (void) snprintf(&flagstr[flgndx], FLAGSZ - flgndx, MSG_ORIG(MSG_SYMINFO_UNKFLAG), flags); else flagstr[flgndx] = '\0';
--- a/usr/src/cmd/sgs/packages/common/SUNWonld-README Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/packages/common/SUNWonld-README Mon Jan 22 19:26:57 2007 -0800 @@ -1130,6 +1130,7 @@ 6423746 add an option to relax the resolution of COMDAT relocs (D) 4934427 runtime linker should load up static symbol names visible to dladdr() (D) + PSARC 2006/526 SHT_SUNW_LDYNSYM - default local symbol addition 6448719 sys/elf.h could be updated with additional machine and ABI types 6336605 link-editors need to support R_*_SIZE relocations PSARC/2006/558 R_*_SIZE relocation support @@ -1153,3 +1154,5 @@ 6501793 GOTOP relocation transition (optimization) fails with offsets > 2^32 6515970 HWCAP processing doesn't clean up fmap structure - browser fails to run java applet +6494214 Refinements to symbolic binding, symbol declarations and interposition + PSARC/2006/714 ld(1) mapfile: symbol interpose definition
--- a/usr/src/cmd/sgs/rtld/Makefile.com Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/rtld/Makefile.com Mon Jan 22 19:26:57 2007 -0800 @@ -19,7 +19,7 @@ # CDDL HEADER END # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -95,8 +95,8 @@ $(RTLDLIB) -lrtld \ $(LDLIB) $(LD_LIB) -DYNFLAGS += -i -e _rt_boot $(VERSREF) -Bsymbolic -zlazyload -znodlopen \ - -z interpose -zdtrace=dtrace_data '-R$$ORIGIN' +DYNFLAGS += -i -e _rt_boot $(VERSREF) $(ZLAZYLOAD) $(ZNODLOPEN) \ + $(ZINTERPOSE) -zdtrace=dtrace_data '-R$$ORIGIN' BUILD.s= $(AS) $(ASFLAGS) $< -o $@
--- a/usr/src/cmd/sgs/rtld/amd64/mapfile-amd64-vers Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/rtld/amd64/mapfile-amd64-vers Mon Jan 22 19:26:57 2007 -0800 @@ -1,13 +1,12 @@ # -# Copyright 2005 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # CDDL HEADER START # # The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. @@ -26,7 +25,7 @@ # SUNWprivate_1.2 { - global: + protected: _dlamd64getunwind; dlamd64getunwind; };
--- a/usr/src/cmd/sgs/rtld/common/_rtld.h Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/rtld/common/_rtld.h Mon Jan 22 19:26:57 2007 -0800 @@ -23,7 +23,7 @@ * All Rights Reserved * * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -562,15 +562,16 @@ extern void get_lcinterface(Rt_map *, Lc_interface *); extern Lmid_t get_linkmap_id(Lm_list *); extern Pnode *get_next_dir(Pnode **, Rt_map *, uint_t); -int hdl_add(Grp_hdl *, Rt_map *, uint_t); -Grp_hdl *hdl_create(Lm_list *, Rt_map *, Rt_map *, uint_t); -int hdl_initialize(Grp_hdl *, Rt_map *, Rt_map *, int, int); +extern int hdl_add(Grp_hdl *, Rt_map *, uint_t); +extern Grp_hdl *hdl_create(Lm_list *, Rt_map *, Rt_map *, uint_t); +extern int hdl_initialize(Grp_hdl *, Rt_map *, Rt_map *, int, int); extern int hwcap_check(Rej_desc *, Ehdr *); extern Pnode *hwcap_filtees(Pnode **, Aliste, Dyninfo *, Rt_map *, const char *, int, uint_t); -void is_dep_ready(Rt_map *, Rt_map *, int); -void is_dep_init(Rt_map *, Rt_map *); -void ldso_plt_init(Rt_map *); +extern void is_dep_ready(Rt_map *, Rt_map *, int); +extern void is_dep_init(Rt_map *, Rt_map *); +extern int is_sym_interposer(Rt_map *, Sym *); +extern void ldso_plt_init(Rt_map *); extern Listnode *list_append(List *, const void *); extern Listnode *list_insert(List *, const void *, Listnode *); extern Listnode *list_prepend(List *, const void *);
--- a/usr/src/cmd/sgs/rtld/common/analyze.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/rtld/common/analyze.c Mon Jan 22 19:26:57 2007 -0800 @@ -23,7 +23,7 @@ * Copyright (c) 1988 AT&T * All Rights Reserved * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" @@ -1844,7 +1844,7 @@ * If the object wasn't explicitly dlopen()'ed associate it with * the parent. */ - if (flags != FLG_RT_HANDLE) + if ((flags & FLG_RT_HANDLE) == 0) nmode |= RTLD_PARENT; } @@ -2234,15 +2234,35 @@ } /* + * Determine whether a symbol is defined as an interposer. + */ +int +is_sym_interposer(Rt_map *lmp, Sym *sym) +{ + Syminfo *sip = SYMINFO(lmp); + + if (sip) { + ulong_t ndx; + + ndx = (((ulong_t)sym - (ulong_t)SYMTAB(lmp)) / SYMENT(lmp)); + /* LINTED */ + sip = (Syminfo *)((char *)sip + (ndx * SYMINENT(lmp))); + if (sip->si_flags & SYMINFO_FLG_INTERPOSE) + return (1); + } + return (0); +} + +/* * While processing direct or group bindings, determine whether the object to * which we've bound can be interposed upon. In this context, copy relocations * are a form of interposition. */ static Sym * -lookup_sym_interpose(Slookup *slp, Rt_map **dlmp, uint_t *binfo, Lm_list * lml, - Sym * sym) +lookup_sym_interpose(Slookup *slp, Rt_map **dlmp, uint_t *binfo, Lm_list *lml, + Sym *sym) { - Rt_map * lmp; + Rt_map *lmp; Slookup sl; /* @@ -2278,7 +2298,7 @@ */ lmp = lml->lm_head; sl = *slp; - if (((FLAGS(lmp) & FLG_RT_INTRPOSE) == 0) || (sl.sl_flags & LKUP_COPY)) + if (((FLAGS(lmp) & MSK_RT_INTPOSE) == 0) || (sl.sl_flags & LKUP_COPY)) lmp = (Rt_map *)NEXT(lmp); else sl.sl_flags &= ~LKUP_SPEC; @@ -2286,13 +2306,29 @@ for (; lmp; lmp = (Rt_map *)NEXT(lmp)) { if (FLAGS(lmp) & FLG_RT_DELETE) continue; - if ((FLAGS(lmp) & FLG_RT_INTRPOSE) == 0) + if ((FLAGS(lmp) & MSK_RT_INTPOSE) == 0) break; if (callable(lmp, *dlmp, 0)) { + Rt_map *ilmp; + sl.sl_imap = lmp; - if (sym = SYMINTP(lmp)(&sl, dlmp, binfo)) { + if (sym = SYMINTP(lmp)(&sl, &ilmp, binfo)) { + /* + * If this object provides individual symbol + * interposers, make sure that the symbol we + * have found is tagged as an interposer. + */ + if ((FLAGS(ilmp) & FLG_RT_SYMINTPO) && + (is_sym_interposer(ilmp, sym) == 0)) + continue; + + /* + * Indicate this binding has occurred to an + * interposer, and return the symbol. + */ *binfo |= DBG_BINFO_INTERPOSE; + *dlmp = ilmp; return (sym); } } @@ -2511,7 +2547,7 @@ */ if (((FLAGS(clmp) & FLG_RT_TRANS) || (!(LIST(clmp)->lm_tflags & LML_TFLG_NODIRECT))) && - ((FLAGS(clmp) & FLG_RT_DIRECT) || + ((FLAGS1(clmp) & FL1_RT_DIRECT) || (sip->si_flags & SYMINFO_FLG_DIRECTBIND))) { sym = lookup_sym_direct(slp, dlmp, binfo, sip, lmp); @@ -2538,8 +2574,21 @@ */ if (FLAGS1(clmp) & FL1_RT_SYMBOLIC) { sl.sl_imap = clmp; - if (sym = SYMINTP(clmp)(&sl, dlmp, binfo)) - return (sym); + if (sym = SYMINTP(clmp)(&sl, dlmp, binfo)) { + ulong_t dsymndx = (((ulong_t)sym - + (ulong_t)SYMTAB(*dlmp)) / SYMENT(*dlmp)); + + /* + * Make sure this symbol hasn't explicitly been defined + * as nodirect. + */ + if (((sip = SYMINFO(*dlmp)) == 0) || + /* LINTED */ + ((sip = (Syminfo *)((char *)sip + + (dsymndx * SYMINENT(*dlmp)))) == 0) || + ((sip->si_flags & SYMINFO_FLG_NOEXTDIRECT) == 0)) + return (sym); + } } /*
--- a/usr/src/cmd/sgs/rtld/common/elf.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/rtld/common/elf.c Mon Jan 22 19:26:57 2007 -0800 @@ -23,7 +23,7 @@ * Copyright (c) 1988 AT&T * All Rights Reserved * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" @@ -1300,7 +1300,7 @@ * Disable filtee use. */ static void -elf_disable_filtee(Rt_map * lmp, Dyninfo * dip) +elf_disable_filtee(Rt_map *lmp, Dyninfo *dip) { dip->di_info = 0; @@ -1418,7 +1418,7 @@ * using their group handle to lookup the symbol. */ for (any = 0, pnpp = (Pnode **)&(dip->di_info), pnp = *pnpp; pnp; - pnpp = &pnp->p_next, pnp = * pnpp) { + pnpp = &pnp->p_next, pnp = *pnpp) { int mode; Grp_hdl *ghp; Rt_map *nlmp = 0; @@ -1893,7 +1893,9 @@ if (sym->st_shndx != SHN_UNDEF) { *dlmp = ilmp; *binfo |= DBG_BINFO_FOUND; - if (FLAGS(ilmp) & FLG_RT_INTRPOSE) + if ((FLAGS(ilmp) & FLG_RT_OBJINTPO) || + ((FLAGS(ilmp) & FLG_RT_SYMINTPO) && + is_sym_interposer(ilmp, sym))) *binfo |= DBG_BINFO_INTERPOSE; break; @@ -1910,7 +1912,9 @@ (ELF_ST_TYPE(sym->st_info) == STT_FUNC)) { *dlmp = ilmp; *binfo |= (DBG_BINFO_FOUND | DBG_BINFO_PLTADDR); - if (FLAGS(ilmp) & FLG_RT_INTRPOSE) + if ((FLAGS(ilmp) & FLG_RT_OBJINTPO) || + ((FLAGS(ilmp) & FLG_RT_SYMINTPO) && + is_sym_interposer(ilmp, sym))) *binfo |= DBG_BINFO_INTERPOSE; return (sym); } @@ -2293,7 +2297,7 @@ if (ld->d_un.d_val & DF_1_CONFALT) crle = 1; if (ld->d_un.d_val & DF_1_DIRECT) - FLAGS(lmp) |= FLG_RT_DIRECT; + FLAGS1(lmp) |= FL1_RT_DIRECT; if (ld->d_un.d_val & DF_1_NODEFLIB) FLAGS1(lmp) |= FL1_RT_NODEFLIB; if (ld->d_un.d_val & DF_1_ENDFILTEE) @@ -2310,16 +2314,18 @@ * already started, then demote it. It's too * late to guarantee complete interposition. */ - if (ld->d_un.d_val & DF_1_INTERPOSE) { - if ((lml->lm_flags & LML_FLG_STARTREL) == 0) - FLAGS(lmp) |= FLG_RT_INTRPOSE; - else { + if (ld->d_un.d_val & + (DF_1_INTERPOSE | DF_1_SYMINTPOSE)) { + if (lml->lm_flags & LML_FLG_STARTREL) { DBG_CALL(Dbg_util_intoolate(lmp)); if (lml->lm_flags & LML_FLG_TRC_ENABLE) (void) printf( MSG_INTL(MSG_LDD_REL_ERR2), NAME(lmp)); - } + } else if (ld->d_un.d_val & DF_1_INTERPOSE) + FLAGS(lmp) |= FLG_RT_OBJINTPO; + else + FLAGS(lmp) |= FLG_RT_SYMINTPO; } break; case DT_SYMINFO: @@ -3086,10 +3092,10 @@ } static void -elf_lazy_cleanup(Alist * alp) +elf_lazy_cleanup(Alist *alp) { - Rt_map ** lmpp; - Aliste off; + Rt_map **lmpp; + Aliste off; /* * Cleanup any link-maps added to this dynamic list and free it.
--- a/usr/src/cmd/sgs/rtld/common/mapfile-32-vers Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/rtld/common/mapfile-32-vers Mon Jan 22 19:26:57 2007 -0800 @@ -20,14 +20,14 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" # SUNWprivate_1.2 { - global: + protected: do32_reloc; # Required to support librtld.so reloc32_table; };
--- a/usr/src/cmd/sgs/rtld/common/mapfile-64-vers Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/rtld/common/mapfile-64-vers Mon Jan 22 19:26:57 2007 -0800 @@ -20,14 +20,14 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" # SUNWprivate_1.2 { - global: + protected: do64_reloc; # Required to support librtld.so reloc64_table; };
--- a/usr/src/cmd/sgs/rtld/common/mapfile-vers Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/rtld/common/mapfile-vers Mon Jan 22 19:26:57 2007 -0800 @@ -20,7 +20,7 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" @@ -40,7 +40,7 @@ # All symbols in ld.so.1 are private as no-one should bind to these directly. SUNWprivate_1.2 { - global: + protected: _dladdr; # Standard dlopen(3x) family dladdr; _dladdr1;
--- a/usr/src/cmd/sgs/rtld/common/setup.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/rtld/common/setup.c Mon Jan 22 19:26:57 2007 -0800 @@ -23,7 +23,7 @@ * Copyright (c) 1988 AT&T * All Rights Reserved * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" @@ -97,7 +97,7 @@ if ((lmflags & LML_FLG_TRC_ENABLE) && (FLAGS1(lmp) & FL1_RT_LDDSTUB)) flags = FLG_RT_PRELOAD; else - flags = (FLG_RT_PRELOAD | FLG_RT_INTRPOSE); + flags = (FLG_RT_PRELOAD | FLG_RT_OBJINTPO); ptr = strtok_r(objs, MSG_ORIG(MSG_STR_DELIMIT), &next); do { @@ -127,7 +127,7 @@ * error occurred with loading this object, indicate that this * link-map list contains an interposer. */ - flags |= FLG_RT_INTRPOSE; + flags |= FLG_RT_OBJINTPO; if (nlmp == 0) { if ((lmflags & LML_FLG_TRC_ENABLE) || (rtld_flags & RT_FL_SECURE))
--- a/usr/src/cmd/sgs/rtld/common/util.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/rtld/common/util.c Mon Jan 22 19:26:57 2007 -0800 @@ -23,7 +23,7 @@ * Copyright (c) 1988 AT&T * All Rights Reserved * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" @@ -1124,7 +1124,7 @@ lmc->lc_head = lmc->lc_tail = lmp; add = 0; - } else if (FLAGS(lmp) & FLG_RT_INTRPOSE) { + } else if (FLAGS(lmp) & FLG_RT_OBJINTPO) { Rt_map *tlmp; /* @@ -1152,7 +1152,7 @@ for (tlmp = (Rt_map *)NEXT(lmc->lc_head); tlmp; tlmp = (Rt_map *)NEXT(tlmp)) { - if (FLAGS(tlmp) & FLG_RT_INTRPOSE) + if (FLAGS(tlmp) & FLG_RT_OBJINTPO) continue; /* @@ -1194,7 +1194,7 @@ * link-map can be explicitly defined as an interposer so that it can * provide interposition over direct binding requests. */ - if (FLAGS(lmp) & FLG_RT_INTRPOSE) + if (FLAGS(lmp) & MSK_RT_INTPOSE) lml->lm_flags |= LML_FLG_INTRPOSE; /*
--- a/usr/src/cmd/sgs/rtld/mdbmod/common/rtld.c Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/rtld/mdbmod/common/rtld.c Mon Jan 22 19:26:57 2007 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -70,9 +70,9 @@ { MSG_ORIG(MSG_FLG_NOOPEN), FLG_RT_NOOPEN, FLG_RT_NOOPEN}, { MSG_ORIG(MSG_FLG_FINICLCT), FLG_RT_FINICLCT, FLG_RT_FINICLCT}, { MSG_ORIG(MSG_FLG_INITCALL), FLG_RT_INITCALL, FLG_RT_INITCALL}, - { MSG_ORIG(MSG_FLG_INTRPOSE), FLG_RT_INTRPOSE, FLG_RT_INTRPOSE}, - { MSG_ORIG(MSG_FLG_DIRECT), FLG_RT_DIRECT, FLG_RT_DIRECT}, { MSG_ORIG(MSG_FLG_SUNWBSS), FLG_RT_SUNWBSS, FLG_RT_SUNWBSS}, + { MSG_ORIG(MSG_FLG_OBJINTPO), FLG_RT_OBJINTPO, FLG_RT_OBJINTPO}, + { MSG_ORIG(MSG_FLG_SYMINTPO), FLG_RT_SYMINTPO, FLG_RT_SYMINTPO}, { MSG_ORIG(MSG_FLG_MOVE), FLG_RT_MOVE, FLG_RT_MOVE}, { MSG_ORIG(MSG_FLG_DLSYM), FLG_RT_DLSYM, FLG_RT_DLSYM}, { MSG_ORIG(MSG_FLG_REGSYMS), FLG_RT_REGSYMS, FLG_RT_REGSYMS}, @@ -99,6 +99,9 @@ { MSG_ORIG(MSG_FL1_OBJAFLTR), FL1_RT_OBJAFLTR, FL1_RT_OBJAFLTR }, { MSG_ORIG(MSG_FL1_SYMSFLTR), FL1_RT_SYMSFLTR, FL1_RT_SYMSFLTR }, { MSG_ORIG(MSG_FL1_SYMAFLTR), FL1_RT_SYMAFLTR, FL1_RT_SYMAFLTR }, + { MSG_ORIG(MSG_FL1_TLSADD), FL1_RT_TLSADD, FL1_RT_TLSADD }, + { MSG_ORIG(MSG_FL1_TLSSTAT), FL1_RT_TLSSTAT, FL1_RT_TLSSTAT }, + { MSG_ORIG(MSG_FL1_DIRECT), FL1_RT_DIRECT, FL1_RT_DIRECT}, { MSG_ORIG(MSG_LTFL_AUD_PREINIT), LML_TFLG_AUD_PREINIT, LML_TFLG_AUD_PREINIT },
--- a/usr/src/cmd/sgs/rtld/mdbmod/common/rtld.msg Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/cmd/sgs/rtld/mdbmod/common/rtld.msg Mon Jan 22 19:26:57 2007 -0800 @@ -20,7 +20,7 @@ # # -# Copyright 2006 Sun Microsystems, Inc. All rights reserved. +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # pragma ident "%Z%%M% %I% %E% SMI" @@ -63,54 +63,57 @@ # # Flag Strings # -@ MSG_FLG_ISMAIN "ISMAIN" -@ MSG_FLG_IMGALLOC "IMGALLOC" +@ MSG_FLG_ISMAIN "IS-MAIN" +@ MSG_FLG_IMGALLOC "IMAGE-ALLOCATED" @ MSG_FLG_RELOCED "RELOCED" -@ MSG_FLG_SETGROUP "SETGROUP" +@ MSG_FLG_SETGROUP "SET-GROUP" @ MSG_FLG_HWCAP "HWCAP" @ MSG_FLG_OBJECT "OBJECT" @ MSG_FLG_NODUMP "NODUMP" @ MSG_FLG_DELETE "DELETE" @ MSG_FLG_ANALYZED "ANALYZED" -@ MSG_FLG_INITDONE "INITDONE" +@ MSG_FLG_INITDONE "INIT-DONE" @ MSG_FLG_TRANS "TRANS" @ MSG_FLG_FIXED "FIXED" @ MSG_FLG_PRELOAD "PRELOAD" -@ MSG_FLG_ALTER "ALTER" -@ MSG_FLG_LOADFLTR "LOADFLTR" +@ MSG_FLG_ALTER "ALTERNATE" +@ MSG_FLG_LOADFLTR "LOAD-FILTERS" @ MSG_FLG_AUDIT "AUDIT" -@ MSG_FLG_MODESET "MODESET" +@ MSG_FLG_MODESET "MODE-SET" @ MSG_FLG_ANALZING "ANALYZING" -@ MSG_FLG_INITFRST "INITFRST" -@ MSG_FLG_NOOPEN "NOOPEN" -@ MSG_FLG_FINICLCT "FINICLCT" -@ MSG_FLG_INITCALL "INITCALL" -@ MSG_FLG_INTRPOSE "INTRPOSE" -@ MSG_FLG_DIRECT "DIRECT" +@ MSG_FLG_INITFRST "INIT-FIRST" +@ MSG_FLG_NOOPEN "NO-OPEN" +@ MSG_FLG_FINICLCT "FINI-COLLECTED" +@ MSG_FLG_INITCALL "INIT-CALLED" @ MSG_FLG_SUNWBSS "SUNWBSS" +@ MSG_FLG_OBJINTPO "OBJECT-INTERPOSE" +@ MSG_FLG_SYMINTPO "SYMBOL-INTERPOSE" @ MSG_FLG_MOVE "MOVE" @ MSG_FLG_DLSYM "DLSYM" -@ MSG_FLG_REGSYMS "REGSYMS" -@ MSG_FLG_INITCLCT "INITCLCT" +@ MSG_FLG_REGSYMS "REGISTER-SYMS" +@ MSG_FLG_INITCLCT "INIT-COLLECTED" @ MSG_FLG_HANDLE "HANDLE" @ MSG_FLG_RELOCING "RELOCATING" @ MSG_FL1_COPYTOOK "COPYTOOK" @ MSG_FL1_RELATIVE "RELATIVE" @ MSG_FL1_CONFSET "CONFSET" -@ MSG_FL1_NODEFLIB "NODEFLIB" -@ MSG_FL1_ENDFILTE "ENDFILTE" -@ MSG_FL1_DISPREL "DISPREL" -@ MSG_FL1_TEXTREL "TEXTREL" -@ MSG_FL1_INITWAIT "INITWAIT" +@ MSG_FL1_NODEFLIB "NO-DEFAULT-LIBPATH" +@ MSG_FL1_ENDFILTE "END-FILTEE" +@ MSG_FL1_DISPREL "DISPLACEMENT-RELOCATED" +@ MSG_FL1_TEXTREL "TEXT-RELOCATED" +@ MSG_FL1_INITWAIT "INIT-WAIT" @ MSG_FL1_LDDSTUB "LDDSTUB" -@ MSG_FL1_NOINIFIN "NOINITFINI" +@ MSG_FL1_NOINIFIN "NO-INITFINI" @ MSG_FL1_USED "USED" @ MSG_FL1_SYMBOLIC "SYMBOLIC" -@ MSG_FL1_OBJSFLTR "OBJSFLTR" -@ MSG_FL1_OBJAFLTR "OBJAFLTR" -@ MSG_FL1_SYMSFLTR "SYMSFLTR" -@ MSG_FL1_SYMAFLTR "SYMAFLTR" +@ MSG_FL1_OBJSFLTR "OBJ-STD-FILTER" +@ MSG_FL1_OBJAFLTR "OBJ-AUX-FILTER" +@ MSG_FL1_SYMSFLTR "SYM-STD-FILTER" +@ MSG_FL1_SYMAFLTR "SYM-AUX-FILTER" +@ MSG_FL1_TLSADD "TLS-ADD" +@ MSG_FL1_TLSSTAT "TLS-STAT" +@ MSG_FL1_DIRECT "DIRECT" @ MSG_MODE_LAZY "LAZY" @ MSG_MODE_NOW "NOW"
--- a/usr/src/uts/common/sys/link.h Mon Jan 22 17:10:39 2007 -0800 +++ b/usr/src/uts/common/sys/link.h Mon Jan 22 19:26:57 2007 -0800 @@ -23,7 +23,7 @@ * Copyright (c) 1988 AT&T * All Rights Reserved * - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -120,7 +120,7 @@ #define DT_SUNW_SYMTAB 0x60000011 /* symtab with local fcn */ /* symbols immediately */ /* preceding DT_SYMTAB */ -#define DT_SUNW_SYMSZ 0x60000012 /* Size of SUNW_SYMTAB table */ +#define DT_SUNW_SYMSZ 0x60000012 /* size of SUNW_SYMTAB table */ #define DT_HIOS 0x6ffff000 /* @@ -218,7 +218,7 @@ #define DF_1_ORIGIN 0x00000080 /* ORIGIN processing required */ #define DF_1_DIRECT 0x00000100 /* direct binding enabled */ #define DF_1_TRANS 0x00000200 -#define DF_1_INTERPOSE 0x00000400 /* object is an 'interposer' */ +#define DF_1_INTERPOSE 0x00000400 /* object is an interposer */ #define DF_1_NODEFLIB 0x00000800 /* ignore default library search path */ #define DF_1_NODUMP 0x00001000 /* object can't be dldump(3x)'ed */ #define DF_1_CONFALT 0x00002000 /* configuration alternative created */ @@ -233,6 +233,8 @@ #define DF_1_NOHDR 0x00100000 /* mapfile ?N:1st segment mapping */ /* omits ELF & program headers */ #define DF_1_NORELOC 0x00400000 /* internal: unrelocated object */ +#define DF_1_SYMINTPOSE 0x00800000 /* individual symbol interposers */ + /* exist */ /* * Values set to DT_FEATURE_1 tag's d_val. @@ -393,7 +395,7 @@ /* to object containing defn. */ #define SYMINFO_FLG_PASSTHRU 0x0002 /* ignored - see SYMINFO_FLG_FILTER */ #define SYMINFO_FLG_COPY 0x0004 /* symbol is a copy-reloc */ -#define SYMINFO_FLG_LAZYLOAD 0x0008 /* object containing defn should be */ +#define SYMINFO_FLG_LAZYLOAD 0x0008 /* object containing defn. should be */ /* lazily-loaded */ #define SYMINFO_FLG_DIRECTBIND 0x0010 /* ref should be bound directly to */ /* object containing defn. */ @@ -401,6 +403,7 @@ /* directly bind to this symbol */ #define SYMINFO_FLG_FILTER 0x0002 /* symbol ref is associated to a */ #define SYMINFO_FLG_AUXILIARY 0x0040 /* standard or auxiliary filter */ +#define SYMINFO_FLG_INTERPOSE 0x0080 /* symbol defines an interposer */ /* * Syminfo.si_boundto values.