diff options
author | Peter Wemm <peter@FreeBSD.org> | 1995-10-28 12:27:20 +0000 |
---|---|---|
committer | Peter Wemm <peter@FreeBSD.org> | 1995-10-28 12:27:20 +0000 |
commit | 62c10d2dcb796989ce9cd789eb969678dcfe68fa (patch) | |
tree | 99dd342e5f784eac91e7c9aca0f37f8d3da7a548 /usr.bin/symorder | |
parent | 25c3d351214d258be7e50841929071e7990722f3 (diff) | |
download | src-62c10d2dcb796989ce9cd789eb969678dcfe68fa.tar.gz src-62c10d2dcb796989ce9cd789eb969678dcfe68fa.zip |
symorder appears to have been designed to run on executable files
only, as it payes no attention to the relocation table (which
references the symbols).
As a result, running "symorder -c" to clean up the visibility of a LKM
".o" file (as is done in the new bsd.kmod.mk) totally screws up the
relocation table, making the LKM file unloadable. (ld: bogus
relocation record)
This is a pretty crude fix - I've changed symorder so that when
running in "cleanup" mode, it disables the reordering which was
screwing up the relocation table. I'm sure there is a better fix, but
I didn't have the energy. Feel free to fix this hack, probably by
renumbering the symbol indexes in the relocation table.
Notes
Notes:
svn path=/head/; revision=11856
Diffstat (limited to 'usr.bin/symorder')
-rw-r--r-- | usr.bin/symorder/symorder.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/usr.bin/symorder/symorder.c b/usr.bin/symorder/symorder.c index 5c709b66ed05..4a1b79f99676 100644 --- a/usr.bin/symorder/symorder.c +++ b/usr.bin/symorder/symorder.c @@ -185,15 +185,19 @@ main(argc, argv) strtabsize - sizeof(int)) badfmt("corrupted string table"); - newtab = (struct nlist *)malloc(n); - if (newtab == (struct nlist *)NULL) - error(NULL); - memset(newtab, 0, n); - i = n / sizeof(struct nlist); - reorder(symtab, newtab, i); - free((void *)symtab); - symtab = newtab; + if (!clean) { + newtab = (struct nlist *)malloc(n); + if (newtab == (struct nlist *)NULL) + error(NULL); + memset(newtab, 0, n); + + reorder(symtab, newtab, i); + free((void *)symtab); + symtab = newtab; + } else { + symfound = symkept = i; + } newstrings = malloc(strtabsize); if (newstrings == NULL) |