static char *sccsid
= "@(#)symorder.c 4.4 (Berkeley) %G%";
* symorder - reorder symbol table
struct nlist order
[SPACE
];
register struct nlist
*p
, *q
;
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 (maxlen
< strlen(p
->n_un
.n_name
))
maxlen
= strlen(p
->n_un
.n_name
);
if((f
= fopen(argv
[2], "r")) == NULL
)
perror(argv
[2]), exit(1);
if((strf
= 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", argv
[2]);
while(n
&& symfound
< nsym
) {
if(fread(&nl1
, sizeof nl1
, 1, f
) != 1) {
fprintf(stderr
, "Short file "); perror(argv
[2]);
if (nl1
.n_un
.n_strx
== 0 || nl1
.n_type
& N_STAB
)
fseek(strf
, ss
+nl1
.n_un
.n_strx
, 0);
fread(asym
, maxlen
+1, 1, strf
);
for(j
= 0; j
< nsym
; j
++) {
if(asym
[i
] != order
[j
].n_un
.n_name
[i
])
if (order
[j
].n_un
.n_name
[i
])
fseek(f
, (i
= (sa
+(j
* sizeof nl1
))), 0);
if(fread(&nl2
, sizeof nl2
, 1, f
) != 1)
printf("Read err on 2nd asym\n");
if(write(o
, &nl1
, sizeof nl1
) == -1)
lseek(o
, na
-sizeof nl1
, 0);
if(write(o
, &nl2
, sizeof nl2
) == -1)
fprintf(stderr
, "%d symbol(s) not found:\n", nsym
- symfound
);
for (i
= 0; i
< nsym
; i
++) {
if (order
[i
].n_value
== 0)
printf("%s\n", order
[i
].n_un
.n_name
);
savetab
= (char *)malloc(saveleft
);
"symorder: ran out of memory (savestr)\n");
strncpy(savetab
, cp
, len
);