aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/symorder
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>1995-10-28 12:27:20 +0000
committerPeter Wemm <peter@FreeBSD.org>1995-10-28 12:27:20 +0000
commit62c10d2dcb796989ce9cd789eb969678dcfe68fa (patch)
tree99dd342e5f784eac91e7c9aca0f37f8d3da7a548 /usr.bin/symorder
parent25c3d351214d258be7e50841929071e7990722f3 (diff)
downloadsrc-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.c20
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)