shithub: scc

Download patch

ref: a32972000ab291dd3cefeceb5a62864b0e01a371
parent: 5b919477354727041f8a522f0f91273e623fa58d
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Fri Aug 23 15:26:02 EDT 2019

[libmach] Stop using Objsymdef in setidx

This type is not needed and it is creating confusion. This is
the first step to remove the type.

--- a/include/scc/scc/mach.h
+++ b/include/scc/scc/mach.h
@@ -59,7 +59,7 @@
 	int (*addseg)(Obj *obj, void *seg);
 	int (*strip)(Obj *obj);
 	int (*addr2line)(Obj *, unsigned long long , char *, int *);
-	int (*setidx)(long nsyms, Objsymdef *def, FILE *fp);
+	int (*setidx)(long nsyms, char *names[], long offset[], FILE *fp);
 	int (*getidx)(long *nsyms, Objsymdef **def, FILE *fp);
 };
 
--- a/src/cmd/ranlib.c
+++ b/src/cmd/ranlib.c
@@ -265,11 +265,14 @@
 	return ret;
 }
 
+
 static void
 ranlib(char *fname)
 {
-	int c;
+	long *offs, i;
+	char **names;
 	FILE *fp, *idx, *out;
+	Objsymdef *dp;
 	struct fprop prop;
 
 	errno = 0;
@@ -276,6 +279,8 @@
 	nolib = 0;
 	artype = -1;
 	nsymbols = 0;
+	offs = NULL;
+	names = NULL;
 	filename = fname;
 	freehash();
 
@@ -288,10 +293,18 @@
 	if (!readsyms(fp))
 		goto error;
 
-	if (nolib)
+	if (nolib || nsymbols == 0)
 		goto error;
 
-	if ((*ops->setidx)(nsymbols, head, idx) < 0)
+	offs = malloc(sizeof(long) * nsymbols);
+	names = malloc(sizeof(*names) * nsymbols);
+
+	for (dp = head, i = 0; i < nsymbols; dp = dp->next, i++) {
+		offs[i] = dp->offset;
+		names[i] = dp->name;
+	}
+
+	if ((*ops->setidx)(nsymbols, names, offs, idx) < 0)
 		goto error;
 
 	if (getstat(fname, &prop) < 0)
@@ -302,18 +315,25 @@
 	if (!merge(out, &prop, fp, idx))
 		goto error;
 
+	free(offs);
+	free(names);
 	fclose(fp);
 	fclose(idx);
+	offs = NULL;
+	names = NULL;
 	fp = idx = NULL;
 
 	if (!copy(out, fname))
 		goto error;
-
 	fclose(out);
 
 	return;
 
 error:
+	if (offs)
+		free(offs);
+	if (names)
+		free(names);
 	if (errno)
 		error(errstr());
 	if (idx)
--- a/src/libmach/coff32/coff32.h
+++ b/src/libmach/coff32/coff32.h
@@ -26,7 +26,7 @@
 
 extern int coff32new(Obj *obj);
 extern int coff32read(Obj *obj, FILE *fp);
-extern int coff32setidx(long nsymbols, Objsymdef *head, FILE *fp);
+extern int coff32setidx(long nsymbols, char *names[], long offs[], FILE *fp);
 extern int coff32getidx(long *nsyms, Objsymdef **def, FILE *fp);
 extern int coff32addr2line(Obj *, unsigned long long , char *, int *);
 extern int coff32strip(Obj *obj);
@@ -34,5 +34,6 @@
 extern int coff32write(Obj *obj, FILE *fp);
 extern int coff32probe(unsigned char *buf, char **name);
 
-extern int coff32xsetidx(int order, long nsyms, Objsymdef *head, FILE *fp);
+extern int coff32xsetidx(int order,
+                         long nsymbols, char *names[], long offs[], FILE *fp);
 extern int coff32xgetidx(int order, long *nsyms, Objsymdef **def, FILE *fp);
--- a/src/libmach/coff32/coff32setidx.c
+++ b/src/libmach/coff32/coff32setidx.c
@@ -6,7 +6,7 @@
 #include "coff32.h"
 
 int
-coff32setidx(long nsymbols, Objsymdef *head, FILE *fp)
+coff32setidx(long nsymbols, char *names[], long offs[], FILE *fp)
 {
-	return coff32xsetidx(BIG_ENDIAN, nsymbols, head, fp);
+	return coff32xsetidx(BIG_ENDIAN, nsymbols, names, offs, fp);
 }
--- a/src/libmach/coff32/coff32xsetidx.c
+++ b/src/libmach/coff32/coff32xsetidx.c
@@ -6,7 +6,7 @@
 #include "../libmach.h"
 
 int
-coff32xsetidx(int order, long nsyms, Objsymdef *head, FILE *fp)
+coff32xsetidx(int order, long nsyms, char *names[], long offs[], FILE *fp)
 {
 	long i, n;
 	size_t len;
@@ -17,15 +17,15 @@
 	fwrite(buff, 4, 1, fp);
 	n = 4;
 
-	for (def = head; def; def = def->next) {
-		pack(order, buff, "l", (long) def->offset);
+	for (i = 0; i < nsyms; i++) {
+		pack(order, buff, "l", offs[i]);
 		fwrite(buff, 4, 1, fp);
 		n += 4;
 	}
 
-	for (def = head; def; def = def->next) {
-		len = strlen(def->name) + 1;
-		fwrite(def->name, len, 1, fp);
+	for (i = 0; i < nsyms; i++) {
+		len = strlen(names[i]) + 1;
+		fwrite(names[i], len, 1, fp);
 		n += len;
 	}