commit 166e28278d2647af887159e78a28cae8e45fa381
parent c3fa57c8e3433a5a3d22b558f97e959fd129d613
Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
Date: Fri, 8 May 2026 16:17:13 +0200
libmach: Implement setindex() for elf
Diffstat:
9 files changed, 58 insertions(+), 11 deletions(-)
diff --git a/src/libmach/Makefile b/src/libmach/Makefile
@@ -32,6 +32,7 @@ OBJS =\
rebase.o\
setindex.o\
setidx32.o\
+ setidx64.o\
mapsec.o\
mapseg.o\
setsec.o\
diff --git a/src/libmach/coff32/coff32setidx.c b/src/libmach/coff32/coff32setidx.c
@@ -7,7 +7,7 @@
#include "fun.h"
int
-coff32setidx(long nsymbols, char *names[], long offs[], FILE *fp)
+coff32setidx(int type, long nsymbols, char *names[], long offs[], FILE *fp)
{
- return setidx32(BIG_ENDIAN, nsymbols, names, offs, fp);
+ return setidx32(ORDER(type), nsymbols, names, offs, fp);
}
diff --git a/src/libmach/coff32/fun.h b/src/libmach/coff32/fun.h
@@ -1,6 +1,6 @@
int coff32new(Obj *, int);
int coff32read(Obj *, FILE *);
-int coff32setidx(long, char **, long *, FILE *);
+int coff32setidx(int, long, char **, long *, FILE *);
int coff32getidx(long *, char ***, long **, FILE *);
int coff32pc2line(Obj *, unsigned long long, char *, int *);
int coff32strip(Obj *);
diff --git a/src/libmach/elf/Makefile b/src/libmach/elf/Makefile
@@ -12,6 +12,7 @@ OBJS =\
elfnew.o\
elfprobe.o\
elfread.o\
+ elfsetidx.o\
elftype.o\
all: $(OBJS)
diff --git a/src/libmach/elf/elfsetidx.c b/src/libmach/elf/elfsetidx.c
@@ -0,0 +1,17 @@
+#include <stdio.h>
+
+#include <scc/mach.h>
+#include <scc/coff32.h>
+
+#include "../libmach.h"
+#include "fun.h"
+
+int
+elfsetidx(int type, long nsymbols, char *names[], long offs[], FILE *fp)
+{
+ int (*f)(int, long, char *[], long[], FILE *);
+
+ f = (BITS(type) == OBJ32) ? setidx32 : setidx64;
+
+ return (*f)(ORDER(type), nsymbols, names, offs, fp);
+}
diff --git a/src/libmach/elf/fun.h b/src/libmach/elf/fun.h
@@ -1,7 +1,7 @@
int elfnew(Obj *, int);
int elfread(Obj *, FILE *);
-int elfsetidx(long, char **, long *, FILE *);
-int elfgetidx(long *, char ***, long **, FILE *);
+int elfsetidx(int, long, char **, long *, FILE *);
+int elfgetidx(int, long *, char ***, long **, FILE *);
int elfpc2line(Obj *, unsigned long long , char *, int *);
int elfstrip(Obj *);
void elfdel(Obj *);
@@ -9,9 +9,6 @@ int elfwrite(Obj *, Map *, FILE *);
int elfprobe(unsigned char *, char **);
int elftype(char *);
-int elfxsetidx(int long , char *[], long [], FILE *);
-int elfxgetidx(int, long *, char ***, long **, FILE *);
-
Symbol *elfgetsym(Obj *, int *, Symbol *);
Section *elfgetsec(Obj *, int *, Section *);
Map *elfloadmap(Obj *, FILE *);
diff --git a/src/libmach/libmach.h b/src/libmach/libmach.h
@@ -1,7 +1,7 @@
#ifdef stdin
int copysec(Mapsec *, FILE *);
int setidx32(int, long, char *[], long [], FILE *);
-
+int setidx64(int, long, char *[], long [], FILE *);
#endif
/* common functions */
diff --git a/src/libmach/setidx64.c b/src/libmach/setidx64.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <string.h>
+
+#include <scc/mach.h>
+
+#include "libmach.h"
+
+int
+setidx64(int order, long nsyms, char *names[], long offs[], FILE *fp)
+{
+ long i, n;
+ size_t len;
+ unsigned char buff[8];
+
+ pack(order, buff, "q", (long long) nsyms);
+ fwrite(buff, 8, 1, fp);
+ n = 4;
+
+ for (i = 0; i < nsyms; i++) {
+ n += pack(order, buff, "q", (long long) offs[i]);
+ fwrite(buff, 8, 1, fp);
+ }
+
+ for (i = 0; i < nsyms; i++) {
+ n += len = strlen(names[i]) + 1;
+ fwrite(names[i], len, 1, fp);
+ }
+
+ return fflush(fp) == EOF ? -1 : 0;
+}
diff --git a/src/libmach/setindex.c b/src/libmach/setindex.c
@@ -8,8 +8,9 @@
#include "elf/fun.h"
#include "coff32/fun.h"
-static int (*ops[NFORMATS])(long, char **, long *, FILE *) = {
+static int (*ops[NFORMATS])(int, long, char **, long *, FILE *) = {
[COFF32] = coff32setidx,
+ [ELF] = elfsetidx,
};
int
@@ -23,6 +24,6 @@ setindex(int type, long nsyms, char **names, long *offs, FILE *fp)
return -1;
}
- return (*ops[fmt])(nsyms, names, offs, fp);
+ return (*ops[fmt])(type, nsyms, names, offs, fp);
}