Mercurial > illumos > illumos-gate
changeset 13918:4f2ce6c1a90c
3451 archive libraries with no symbols shouldn't require a string table
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jason King <jason.brian.king@gmail.com>
Approved by: Garrett D'Amore <garrett@damore.org>
author | Richard Lowe <richlowe@richlowe.net> |
---|---|
date | Fri, 04 Jan 2013 23:29:21 -0500 |
parents | c2c5e1bf3119 |
children | e721e2fa45d8 |
files | usr/src/cmd/sgs/libelf/common/getarsym.c usr/src/cmd/sgs/packages/common/SUNWonld-README |
diffstat | 2 files changed, 21 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/cmd/sgs/libelf/common/getarsym.c Fri Jan 04 21:21:01 2013 -0500 +++ b/usr/src/cmd/sgs/libelf/common/getarsym.c Fri Jan 04 23:29:21 2013 -0500 @@ -105,36 +105,43 @@ if (is64) { if (sz < 8 || (sz - 8) / 8 < (n = get8(off))) { _elf_seterr(EFMT_ARSYMSZ, 0); - return (0); + return (NULL); } } else { if (sz < 4 || (sz - 4) / 4 < (n = get4(off))) { _elf_seterr(EFMT_ARSYMSZ, 0); - return (0); + return (NULL); } } off += eltsize; endoff = off + n * eltsize; /* - * string table must be present, null terminated + * If there are symbols in the symbol table, a + * string table must be present and NULL terminated. + * + * The format dictates that the string table must always be + * present, however in the case of an archive containing no + * symbols GNU ar will not create one. We are permissive for + * the sake of compatibility. */ - - if (((str = (char *)endoff) >= endstr) || - (*(endstr - 1) != '\0')) { + if ((n > 0) && (((str = (char *)endoff) >= endstr) || + (*(endstr - 1) != '\0'))) { _elf_seterr(EFMT_ARSYM, 0); - return (0); + return (NULL); } /* + * There is always at least one entry returned if a symtab + * exists since the table's last entry is an artificial one + * with a NULL as_name, but is included in the count. + * * overflow can occur here, but not likely */ - *e = n + 1; - n = sizeof (Elf_Arsym) * (n + 1); - if ((oas = malloc(n)) == 0) { + if ((oas = calloc(n + 1, sizeof (Elf_Arsym))) == NULL) { _elf_seterr(EMEM_ARSYM, errno); - return (0); + return (NULL); } } { @@ -144,7 +151,7 @@ if (str >= endstr) { _elf_seterr(EFMT_ARSYMSTR, 0); free(oas); - return (0); + return (NULL); } if (is64) as->as_off = get8(off); @@ -158,7 +165,7 @@ /* LINTED */ ; } - as->as_name = 0; + as->as_name = NULL; as->as_off = 0; as->as_hash = ~(unsigned long)0L; }
--- a/usr/src/cmd/sgs/packages/common/SUNWonld-README Fri Jan 04 21:21:01 2013 -0500 +++ b/usr/src/cmd/sgs/packages/common/SUNWonld-README Fri Jan 04 23:29:21 2013 -0500 @@ -1643,3 +1643,4 @@ 3453 GNU comdat redirection does exactly the wrong thing 3439 discarded sections shouldn't end up on output lists 3436 relocatable objects also need sloppy relocation +3451 archive libraries with no symbols shouldn't require a string table