commit 74082f4925966f86b2d20c7f95246a239119c0d8
parent 2c2ed02aeb49b2c87ee4271047110ee682bccc47
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Fri, 15 Feb 2019 06:28:55 +0000
[libmach] Add a linked list for the segments
Diffstat:
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/include/scc/scc/mach.h b/include/scc/scc/mach.h
@@ -22,6 +22,7 @@ struct objsect {
unsigned flags;
long offset;
unsigned long long size;
+ Objsect *next;
};
struct objsym {
diff --git a/src/cmd/size.c b/src/cmd/size.c
@@ -42,7 +42,7 @@ newobject(FILE *fp, int type)
int i;
Obj *obj;
unsigned long long total, *p;
- Objsect *secp;
+ Objsect *sp;
struct sizes siz;
if ((obj = objnew(type)) == NULL) {
@@ -56,9 +56,8 @@ newobject(FILE *fp, int type)
}
siz.text = siz.data = siz.bss = 0;
- for (i = 0; i < obj->nsyms; i++) {
- secp = &obj->secs[i];
- switch (secp->type) {
+ for (sp = obj->secs; sp; sp = sp->next) {
+ switch (sp->type) {
case 'T':
p = &siz.text;
break;
@@ -72,12 +71,12 @@ newobject(FILE *fp, int type)
continue;
}
- if (*p > ULLONG_MAX - secp->size) {
+ if (*p > ULLONG_MAX - sp->size) {
error("integer overflow");
goto err;
}
- *p += secp->size;
+ *p += sp->size;
}
total = siz.text + siz.data + siz.bss;
diff --git a/src/libmach/coff32/coff32getsect.c b/src/libmach/coff32/coff32getsect.c
@@ -9,7 +9,7 @@
int
coff32getsect(Obj *obj)
{
- int nsecs;
+ int i;
unsigned sflags, type;
unsigned long flags;
FILHDR *hdr;
@@ -21,13 +21,13 @@ coff32getsect(Obj *obj)
hdr = &coff->hdr;
scn = coff->scns;
- nsecs = 0;
secs = malloc(sizeof(Objsect) * hdr->f_nscns);
if (!secs)
return -1;
- for (sp = secs; sp < &secs[hdr->f_nscns]; sp++) {
- flags = scn->s_flags;
+ for (i = 0; i < hdr->f_nscns; i++) {
+ sp = &secs[i];
+ sp->next = (i < hdr->f_nscns-1) ? &secs[i+1] : NULL;
if (flags & STYP_TEXT) {
type = 'T';
@@ -66,9 +66,9 @@ coff32getsect(Obj *obj)
sp->offset = scn->s_scnptr;
sp->size = scn->s_size;
sp->type = type;
- nsecs++;
}
obj->secs = secs;
+ obj->nsecs = i;
return 1;
}