* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
"@(#) Copyright (c) 1980 Regents of the University of California.\n\
static char sccsid
[] = "@(#)symorder.c 5.1 (Berkeley) %G%";
* symorder - reorder symbol table
struct nlist order
[SPACE
];
char *savestr(), *index(), *malloc();
register struct nlist
*symp
;
register struct nlist
*p
;
fprintf(stderr
, "Usage: symorder orderlist file\n");
if ((f
= fopen(argv
[1], "r")) == NULL
) {
for (p
= order
; fgets(asym
, sizeof asym
, f
) != NULL
; p
++, nsym
++) {
for (i
= 0; asym
[i
] && asym
[i
] != '\n'; i
++)
p
->n_un
.n_name
= savestr(asym
);
if ((f
= fopen(argv
[2], "r")) == NULL
)
perror(argv
[2]), exit(1);
if ((o
= open(argv
[2], 1)) < 0)
perror(argv
[2]), exit(1);
if ((fread(&exec
, sizeof exec
, 1, f
)) != 1 || N_BADMAG(exec
)) {
fprintf(stderr
, "symorder: %s: bad format\n", argv
[2]);
fprintf(stderr
, "symorder: %s is stripped\n", argv
[2]);
if (stb
.st_size
< N_STROFF(exec
)+sizeof(off_t
)) {
fprintf(stderr
, "symorder: %s is in old format or truncated\n",
symtab
= (struct nlist
*)malloc(n
);
if (symtab
== (struct nlist
*)0) {
fprintf(stderr
, "symorder: Out of core, no space for symtab\n");
if (fread((char *)symtab
, 1, n
, f
) != n
) {
fprintf(stderr
, "symorder: Short file "); perror(argv
[2]);
if (fread((char *)&symsize
, sizeof (int), 1, f
) != 1 ||
fprintf(stderr
, "symorder: No strings "); perror(argv
[2]);
strings
= malloc(symsize
);
if (strings
== (char *)0) {
fprintf(stderr
,"symorder: Out of core, no space for strings\n");
if (fread(strings
, 1, symsize
, f
) != symsize
) {
fprintf(stderr
, "symorder: Truncated strings ");
newtab
= (struct nlist
*)malloc(n
);
if (newtab
== (struct nlist
*)0) {
"symorder: Out of core, no space for new symtab\n");
i
= n
/ sizeof (struct nlist
);
reorder(symtab
, newtab
, i
);
newstrings
= malloc(symsize
);
if (newstrings
== (char *)0) {
"symorder: Out of core, no space for newstrings\n");
for (symp
= symtab
; --i
>= 0; symp
++) {
if (symp
->n_un
.n_strx
== 0)
symp
->n_un
.n_strx
-= sizeof (int);
if ((unsigned)symp
->n_un
.n_strx
>= symsize
) {
fprintf(stderr
,"symorder: Corrupted string pointers\n");
strcpy(ns
, &strings
[symp
->n_un
.n_strx
]);
symp
->n_un
.n_strx
= (ns
- newstrings
) + sizeof (int);
if (ns
> &newstrings
[symsize
]) {
fprintf(stderr
, "symorder: Strings grew longer!\n");
if (write(o
, (char *)symtab
, n
) != n
) {
fprintf(stderr
, "symorder: Write failed "); perror(argv
[2]);
if (write(o
, (char *)&symsize
, sizeof (int)) != sizeof (int)) {
fprintf(stderr
, "symorder: Write failed "); perror(argv
[2]);
if (write(o
, newstrings
, symsize
) != symsize
) {
fprintf(stderr
, "symorder: Write failed "); perror(argv
[2]);
if ((i
= nsym
- symfound
) > 0) {
fprintf(stderr
, "symorder: %d symbol%s not found:\n",
for (i
= 0; i
< nsym
; i
++) {
if (order
[i
].n_value
== 0)
printf("%s\n", order
[i
].n_un
.n_name
);
register struct nlist
*st1
, *st2
;
register struct nlist
*stp
= st2
+ nsym
;
register struct nlist
*p
;
register struct nlist
*op
;
nam
= &strings
[p
->n_un
.n_strx
- sizeof(int)];
if (nam
>= &strings
[symsize
]) {
fprintf(stderr
, "symorder: corrupt symtab\n");
for (op
= &order
[nsym
]; --op
>= order
; ) {
if (strcmp(op
->n_un
.n_name
, nam
) != 0)
savetab
= (char *)malloc(saveleft
);
"symorder: ran out of memory (savestr)\n");
strncpy(savetab
, cp
, len
);