commit 4eb5378e2f513589a9c0664544f2b87b3208aedc
parent f20800ef9f4be10663fa2f34763471c4359baa0b
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Fri, 4 Jan 2019 18:31:18 +0000
[libmach] Don't expose all the functions of object formats
Diffstat:
3 files changed, 34 insertions(+), 29 deletions(-)
diff --git a/src/libmach/coff32.c b/src/libmach/coff32.c
@@ -94,8 +94,8 @@ unpack_ent(int order, unsigned char *buf, SYMENT *ent)
unpack(order, "ll", buf, &ent->n_zeroes, &ent->n_offset);
}
-int
-coff32probe(unsigned char *buf, char **name)
+static int
+probe(unsigned char *buf, char **name)
{
struct arch *ap;
@@ -109,8 +109,8 @@ coff32probe(unsigned char *buf, char **name)
return -1;
}
-int
-coff32open(FILE *fp, int type, Obj *obj)
+static int
+open(FILE *fp, int type, Obj *obj)
{
int order;
long i, siz;
@@ -249,8 +249,8 @@ typeof(Coff32 *coff, SYMENT *ent)
return c;
}
-int
-coff32read(Obj *obj, Symbol *sym)
+static int
+read(Obj *obj, Symbol *sym)
{
int t;
char *s;
@@ -275,8 +275,8 @@ coff32read(Obj *obj, Symbol *sym)
return 1;
}
-void
-coff32close(Obj *obj)
+static void
+close(Obj *obj)
{
struct coff32 *coff = obj->data;
@@ -285,3 +285,10 @@ coff32close(Obj *obj)
free(coff->strtbl);
free(obj->data);
}
+
+struct format objcoff32 = {
+ .probe = probe,
+ .open = open,
+ .read = read,
+ .close = close,
+};
diff --git a/src/libmach/libmach.h b/src/libmach/libmach.h
@@ -26,11 +26,15 @@ enum order {
BIG_ENDIAN,
};
+struct format {
+ int (*probe)(unsigned char *buf, char **name);
+ int (*open)(FILE *fp, int type, Obj *obj);
+ int (*read)(Obj *obj, Symbol *sym);
+ void (*close)(Obj *obj);
+};
+
extern int pack(int order, unsigned char *dst, char *fmt, ...);
extern int unpack(int order, unsigned char *src, char *fmt, ...);
/* coff32.c */
-int coff32probe(unsigned char *buf, char **name);
-int coff32open(FILE *fp, int type, Obj *obj);
-int coff32read(Obj *obj, Symbol *sym);
-void coff32close(Obj *obj);
+extern struct format objcoff32;
diff --git a/src/libmach/object.c b/src/libmach/object.c
@@ -9,16 +9,9 @@ static char sccsid[] = "@(#) ./libmach/object.c";
#include "libmach.h"
-struct format {
- int (*probe)(unsigned char *buf, char **name);
- int (*open)(FILE *fp, int type, Obj *obj);
- int (*read)(Obj *obj, Symbol *sym);
- void (*close)(Obj *obj);
-};
-
-static struct format fmts[] = {
- [COFF32] = {coff32probe, coff32open, coff32read, coff32close},
- [NFORMATS] = {NULL},
+static struct format *fmts[] = {
+ [COFF32] = &objcoff32,
+ [NFORMATS] = NULL,
};
int
@@ -26,6 +19,7 @@ objtest(FILE *fp, char **name)
{
int n, i;
int (*fn)(unsigned char *, char **);
+ struct format **bp, *op;
fpos_t pos;
unsigned char buf[NBYTES];
@@ -36,11 +30,11 @@ objtest(FILE *fp, char **name)
if (n != 1 || ferror(fp))
return -1;
- for (i = 0; i < NFORMATS; i++) {
- fn = fmts[i].probe;
- if (!fn)
+ for (bp = fmts; bp < &fmts[NFORMATS]; ++bp) {
+ op = *bp;
+ if (!op || !op->probe)
continue;
- n = (*fn)(buf, name);
+ n = (*op->probe)(buf, name);
if (n == -1)
continue;
return n;
@@ -58,7 +52,7 @@ objopen(FILE *fp, int type, Obj *obj)
obj->symtbl = NULL;
obj->data = NULL;
obj->nsym = obj->cursym = 0;
- op = &fmts[FORMAT(type)];
+ op = fmts[FORMAT(type)];
if ((*op->open)(fp, type, obj) < 0)
return -1;
return 0;
@@ -98,7 +92,7 @@ objread(FILE *fp, Obj *obj, int (*filter)(Symbol *))
Symbol sym, *p;
struct format *op;
- op = &fmts[FORMAT(obj->type)];
+ op = fmts[FORMAT(obj->type)];
while ((r = (*op->read)(obj, &sym)) > 0) {
if (filter && (*filter)(&sym))
continue;
@@ -113,6 +107,6 @@ objclose(Obj *obj)
{
struct format *op;
- op = &fmts[FORMAT(obj->type)];
+ op = fmts[FORMAT(obj->type)];
(*op->close)(obj);
}