scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | README | LICENSE

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:
Msrc/libmach/Makefile | 1+
Msrc/libmach/coff32/coff32setidx.c | 4++--
Msrc/libmach/coff32/fun.h | 2+-
Msrc/libmach/elf/Makefile | 1+
Asrc/libmach/elf/elfsetidx.c | 17+++++++++++++++++
Msrc/libmach/elf/fun.h | 7++-----
Msrc/libmach/libmach.h | 2+-
Asrc/libmach/setidx64.c | 30++++++++++++++++++++++++++++++
Msrc/libmach/setindex.c | 5+++--
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); }