ref: 1055827d79c5371b019dfeec0fc91f2c5c4ebafd
parent: d4565f079cfff9680439f8b0c2b82d7a01167498
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Fri Feb 8 15:39:41 EST 2019
[libmach/coff32] Implement coff32strip
--- a/src/cmd/strip.c
+++ b/src/cmd/strip.c
@@ -29,16 +29,14 @@
strip(char *fname)
{
int type;
- FILE *fp, *tmp;
+ FILE *fp;
Obj *obj;
errno = 0;
filename = fname;
- fp = fopen(fname, "rb");
- tmp = tmpfile();
- if (!fp || !tmp)
- goto err;
+ if ((fp = fopen(fname, "rb")) == NULL)
+ goto err1;
if ((type = objtype(fp, NULL)) < 0) {
error("file format not recognized");
@@ -52,21 +50,22 @@
error("file corrupted");
goto err3;
}
+ fclose(fp);
+ fp = NULL;
+
objstrip(obj);
- if (objwrite(obj, tmp) < 0) {
+ if ((fp = fopen(fname, "wb")) == NULL)
+ goto err1;
+
+ if (objwrite(obj, fp) < 0) {
error("error writing output");
goto err3;
}
fclose(fp);
- fp = NULL;
-
- if (remove(fname) || rename("strip.tmp", fname)) {
- error(strerror(errno));
- goto err3;
- }
objdel(obj);
+
return;
err3:
@@ -75,9 +74,6 @@
if (fp)
fclose(fp);
err1:
- fclose(tmp);
- remove("strip.tmp");
-err:
if (errno)
error(strerror(errno));
--- a/src/libmach/coff32/coff32read.c
+++ b/src/libmach/coff32/coff32read.c
@@ -262,7 +262,7 @@
for (i = 0; i < hdr->f_nscns; i++) {
scn = &coff->scns[i];
- if (scn->s_nlnno == 0)
+ if (scn->s_nrelloc == 0)
continue;
if (!objpos(obj, fp, scn->s_relptr))
--- a/src/libmach/coff32/coff32strip.c
+++ b/src/libmach/coff32/coff32strip.c
@@ -9,12 +9,29 @@
void
coff32strip(Obj *obj)
{
- struct coff32 *coff = obj->data;
+ int i;
FILHDR *hdr;
+ SCNHDR *scn;
+ struct coff32 *coff = obj->data;
hdr = &coff->hdr;
- free(coff->ents);
- coff->ents = NULL;
+ for (i = 0; i < hdr->f_nscns; i++) {
+ scn = &coff->scns[i];
+ scn->s_nrelloc = 0;
+ scn->s_relptr = 0;
+ scn->s_nlnno = 0;
+ scn->s_lnnoptr = 0;
+ }
+
hdr->f_nsyms = 0;
hdr->f_symptr = 0;
+ hdr->f_flags |= F_RELFLG | F_LMNO | F_SYMS;
+
+ free(coff->ents);
+ free(coff->rels);
+ free(coff->lines);
+
+ coff->ents = NULL;
+ coff->rels = NULL;
+ coff->lines = NULL;
}
--- a/src/libmach/coff32/coff32write.c
+++ b/src/libmach/coff32/coff32write.c
@@ -166,6 +166,10 @@
coff = obj->data;
hdr = &coff->hdr;
+
+ if (!coff->ents)
+ return 1;
+
strtbl = NULL;
strsiz = 0;
@@ -212,7 +216,7 @@
fwrite(buf, 4, 1, fp);
fwrite(coff->strtbl, coff->strsiz, 1, fp);
- return ferror(fp);
+ return ferror(fp) == 0;
}
static int
@@ -245,6 +249,9 @@
coff = obj->data;
hdr = &coff->hdr;
+ if (!coff->rels)
+ return 1;
+
for (i = 0; i < hdr->f_nscns; i++) {
rp = coff->rels[i];
if (!rp)
@@ -274,6 +281,9 @@
coff = obj->data;
hdr = &coff->hdr;
+
+ if (!coff->lines)
+ return 1;
for (i = 0; i < hdr->f_nscns; i++) {
lp = coff->lines[i];