# HG changeset patch # User Richard Lowe # Date 1357360161 18000 # Node ID 4f2ce6c1a90c826400589b44bf44d8ee2d3859fe # Parent c2c5e1bf311974fb83ca7aedfe62bea0f33d0125 3451 archive libraries with no symbols shouldn't require a string table Reviewed by: Robert Mustacchi Reviewed by: Jason King Approved by: Garrett D'Amore diff -r c2c5e1bf3119 -r 4f2ce6c1a90c usr/src/cmd/sgs/libelf/common/getarsym.c --- 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; } diff -r c2c5e1bf3119 -r 4f2ce6c1a90c usr/src/cmd/sgs/packages/common/SUNWonld-README --- 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