Add architecture flag to zipobj

This commit is contained in:
Justine Tunney 2023-11-12 09:35:59 -08:00
parent bed77186c3
commit f25beb341c
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
5 changed files with 46 additions and 18 deletions

View file

@ -3944,7 +3944,7 @@ static void Objectify(struct As *a, int path) {
char *p; char *p;
int i, j, s, e; int i, j, s, e;
struct ElfWriter *elf; struct ElfWriter *elf;
elf = elfwriter_open(a->strings.p[path], 0644); elf = elfwriter_open(a->strings.p[path], 0644, EM_NEXGEN32E);
for (i = 0; i < a->symbols.n; ++i) { for (i = 0; i < a->symbols.n; ++i) {
if (!IsLiveSymbol(a, i)) continue; if (!IsLiveSymbol(a, i)) continue;
p = strndup(a->slices.p[a->symbols.p[i].name].p, p = strndup(a->slices.p[a->symbols.p[i].name].p,

View file

@ -646,7 +646,7 @@ Objectify(void)
memcpy(pycdata + sizeof(header), mardata, marsize); memcpy(pycdata + sizeof(header), mardata, marsize);
yoinked = newinterner(); yoinked = newinterner();
forcepulls = newinterner(); forcepulls = newinterner();
elf = elfwriter_open(outpath, 0644); elf = elfwriter_open(outpath, 0644, 0);
elfwriter_cargoculting(elf); elfwriter_cargoculting(elf);
if (ispkg) { if (ispkg) {
elfwriter_zip(elf, zipdir, zipdir, strlen(zipdir), elfwriter_zip(elf, zipdir, zipdir, strlen(zipdir),

View file

@ -156,7 +156,7 @@ static void FlushTables(struct ElfWriter *elf) {
elfwriter_commit(elf, size); elfwriter_commit(elf, size);
} }
struct ElfWriter *elfwriter_open(const char *path, int mode) { struct ElfWriter *elfwriter_open(const char *path, int mode, int arch) {
struct ElfWriter *elf; struct ElfWriter *elf;
CHECK_NOTNULL((elf = calloc(1, sizeof(struct ElfWriter)))); CHECK_NOTNULL((elf = calloc(1, sizeof(struct ElfWriter))));
CHECK_NOTNULL((elf->path = strdup(path))); CHECK_NOTNULL((elf->path = strdup(path)));
@ -166,15 +166,22 @@ struct ElfWriter *elfwriter_open(const char *path, int mode) {
elf->mapsize, PROT_READ | PROT_WRITE, elf->mapsize, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_FIXED, elf->fd, 0))); MAP_SHARED | MAP_FIXED, elf->fd, 0)));
elf->ehdr = memcpy(elf->map, &kObjHeader, (elf->wrote = sizeof(kObjHeader))); elf->ehdr = memcpy(elf->map, &kObjHeader, (elf->wrote = sizeof(kObjHeader)));
if (strstr(path, "/aarch64")) { if (!arch) {
elf->ehdr->e_machine = EM_AARCH64; #ifdef __x86_64__
} else if (strstr(path, "/powerpc64")) { arch = EM_NEXGEN32E;
elf->ehdr->e_machine = EM_PPC64; #elif defined(__aarch64__)
} else if (strstr(path, "/riscv")) { arch = EM_AARCH64;
elf->ehdr->e_machine = EM_RISCV; #elif defined(__powerpc64__)
} else if (strstr(path, "/s390")) { arch = EM_PPC64;
#elif defined(__riscv)
arch = EM_RISCV;
#elif defined(__s390x__)
elf->ehdr->e_machine = EM_S390; elf->ehdr->e_machine = EM_S390;
#else
#error "unsupported architecture"
#endif
} }
elf->ehdr->e_machine = arch;
elf->strtab = newinterner(); elf->strtab = newinterner();
elf->shstrtab = newinterner(); elf->shstrtab = newinterner();
intern(elf->strtab, ""); intern(elf->strtab, "");

View file

@ -54,7 +54,7 @@ struct ElfWriter {
struct Interner *shstrtab; struct Interner *shstrtab;
}; };
struct ElfWriter *elfwriter_open(const char *, int) __wur; struct ElfWriter *elfwriter_open(const char *, int, int) __wur;
void elfwriter_cargoculting(struct ElfWriter *); void elfwriter_cargoculting(struct ElfWriter *);
void elfwriter_close(struct ElfWriter *); void elfwriter_close(struct ElfWriter *);
void elfwriter_align(struct ElfWriter *, size_t, size_t); void elfwriter_align(struct ElfWriter *, size_t, size_t);

View file

@ -43,6 +43,7 @@
#include "tool/build/lib/elfwriter.h" #include "tool/build/lib/elfwriter.h"
#include "tool/build/lib/stripcomponents.h" #include "tool/build/lib/stripcomponents.h"
int arch_;
char *name_; char *name_;
char *yoink_; char *yoink_;
char *symbol_; char *symbol_;
@ -76,6 +77,7 @@ FLAGS\n\
-o PATH output path\n\ -o PATH output path\n\
-0 disable compression\n\ -0 disable compression\n\
-B basename-ify zip filename\n\ -B basename-ify zip filename\n\
-a ARCH microprocessor architecture\n\
-N ZIPPATH zip filename (defaults to input arg)\n\ -N ZIPPATH zip filename (defaults to input arg)\n\
-P ZIPPATH prepend path zip filename using join\n\ -P ZIPPATH prepend path zip filename using join\n\
-C INTEGER strips leading path components from zip filename\n\ -C INTEGER strips leading path components from zip filename\n\
@ -86,14 +88,34 @@ FLAGS\n\
exit(rc); exit(rc);
} }
static int ParseArch(const char *s) {
if (startswith(s, "x86")) {
return EM_NEXGEN32E;
} else if (startswith(s, "arm") || !strcmp(s, "aarch64")) {
return EM_AARCH64;
} else if (startswith(s, "ppc") || startswith(s, "powerpc")) {
return EM_PPC64;
} else if (startswith(s, "riscv")) {
return EM_RISCV;
} else if (startswith(s, "s390")) {
return EM_S390;
} else {
tinyprint(2, "error: unrecognized microprocessor architecture\n", NULL);
exit(1);
}
}
void GetOpts(int *argc, char ***argv) { void GetOpts(int *argc, char ***argv) {
int opt; int opt;
yoink_ = "__zip_eocd"; yoink_ = "__zip_eocd";
while ((opt = getopt(*argc, *argv, "?0nhBN:C:P:o:s:y:")) != -1) { while ((opt = getopt(*argc, *argv, "?0nhBN:C:P:o:s:y:a:")) != -1) {
switch (opt) { switch (opt) {
case 'o': case 'o':
outpath_ = optarg; outpath_ = optarg;
break; break;
case 'a':
arch_ = ParseArch(optarg);
break;
case 'n': case 'n':
exit(0); exit(0);
case 's': case 's':
@ -192,18 +214,18 @@ void PullEndOfCentralDirectoryIntoLinkage(struct ElfWriter *elf) {
} }
void CheckFilenameKosher(const char *path) { void CheckFilenameKosher(const char *path) {
CHECK_LE(kZipCfileHdrMinSize + strlen(path), 65535); unassert(kZipCfileHdrMinSize + strlen(path) <= 65535);
CHECK(!startswith(path, "/")); unassert(!startswith(path, "/"));
CHECK(!strstr(path, "..")); unassert(!strstr(path, ".."));
} }
void zipobj(int argc, char **argv) { void zipobj(int argc, char **argv) {
size_t i; size_t i;
struct ElfWriter *elf; struct ElfWriter *elf;
CHECK_LT(argc, UINT16_MAX / 3 - 64); /* ELF 64k section limit */ unassert(argc < UINT16_MAX / 3 - 64); /* ELF 64k section limit */
GetOpts(&argc, &argv); GetOpts(&argc, &argv);
for (i = 0; i < argc; ++i) CheckFilenameKosher(argv[i]); for (i = 0; i < argc; ++i) CheckFilenameKosher(argv[i]);
elf = elfwriter_open(outpath_, 0644); elf = elfwriter_open(outpath_, 0644, arch_);
elfwriter_cargoculting(elf); elfwriter_cargoculting(elf);
for (i = 0; i < argc; ++i) ProcessFile(elf, argv[i]); for (i = 0; i < argc; ++i) ProcessFile(elf, argv[i]);
PullEndOfCentralDirectoryIntoLinkage(elf); PullEndOfCentralDirectoryIntoLinkage(elf);
@ -211,7 +233,6 @@ void zipobj(int argc, char **argv) {
} }
int main(int argc, char **argv) { int main(int argc, char **argv) {
ShowCrashReports();
timestamp.tv_sec = 1647414000; /* determinism */ timestamp.tv_sec = 1647414000; /* determinism */
/* clock_gettime(CLOCK_REALTIME, &timestamp); */ /* clock_gettime(CLOCK_REALTIME, &timestamp); */
zipobj(argc, argv); zipobj(argc, argv);