aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/ld
diff options
context:
space:
mode:
authorAlex Brainman <alex.brainman@gmail.com>2011-02-23 14:30:40 +1100
committerAlex Brainman <alex.brainman@gmail.com>2011-02-23 14:30:40 +1100
commit0cf6f8c096e8482da62ffa264ba6929f9179945e (patch)
tree352a215bc65de99ccab93ce279912a1b766eefc3 /src/cmd/ld
parentcd0f799e65619c30e984c03b905507ff0216e825 (diff)
downloadgo-0cf6f8c096e8482da62ffa264ba6929f9179945e.tar.xz
5l/6l/8l: use enums for header type and symbolic strings for -H option values
Thanks to rsc for the suggestion. R=r CC=golang-dev https://golang.org/cl/4174060
Diffstat (limited to 'src/cmd/ld')
-rw-r--r--src/cmd/ld/data.c6
-rw-r--r--src/cmd/ld/dwarf.c2
-rw-r--r--src/cmd/ld/lib.c13
-rw-r--r--src/cmd/ld/lib.h31
4 files changed, 48 insertions, 4 deletions
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c
index 0551232cfc..a20b057ce5 100644
--- a/src/cmd/ld/data.c
+++ b/src/cmd/ld/data.c
@@ -241,7 +241,7 @@ dynrelocsym(Sym *s)
{
Reloc *r;
- if(thechar == '8' && HEADTYPE == 10) { // Windows PE
+ if(HEADTYPE == Hwindows) {
Sym *rel, *targ;
rel = lookup(".rel", 0);
@@ -898,9 +898,9 @@ address(void)
segdata.rwx = 06;
segdata.vaddr = va;
segdata.fileoff = va - segtext.vaddr + segtext.fileoff;
- if((thechar == '6' || thechar == '8') && HEADTYPE == 10) // Windows PE
+ if(HEADTYPE == Hwindows)
segdata.fileoff = segtext.fileoff + rnd(segtext.len, PEFILEALIGN);
- if(thechar == '8' && HEADTYPE == 2) { // Plan 9
+ if(HEADTYPE == Hplan9x32) {
segdata.vaddr = va = rnd(va, 4096);
segdata.fileoff = segtext.fileoff + segtext.filelen;
}
diff --git a/src/cmd/ld/dwarf.c b/src/cmd/ld/dwarf.c
index 5df3515f5d..8c53d7d133 100644
--- a/src/cmd/ld/dwarf.c
+++ b/src/cmd/ld/dwarf.c
@@ -2302,7 +2302,7 @@ writegdbscript(void)
static void
align(vlong size)
{
- if((thechar == '6' || thechar == '8') && HEADTYPE == 10) // Only Windows PE need section align.
+ if(HEADTYPE == Hwindows) // Only Windows PE need section align.
strnput("", rnd(size, PEFILEALIGN) - size);
}
diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c
index 1838717bfe..998e28cf16 100644
--- a/src/cmd/ld/lib.c
+++ b/src/cmd/ld/lib.c
@@ -1264,3 +1264,16 @@ stkprint(Chain *ch, int limit)
if(ch->limit != limit)
print("\t%d\tafter %s uses %d\n", limit, name, ch->limit - limit);
}
+
+int
+headtype(char *name)
+{
+ int i;
+
+ for(i=0; headers[i].name; i++)
+ if(strcmp(name, headers[i].name) == 0)
+ return headers[i].val;
+ fprint(2, "unknown header type -H %s\n", name);
+ errorexit();
+ return -1; // not reached
+}
diff --git a/src/cmd/ld/lib.h b/src/cmd/ld/lib.h
index 1b37202271..234ea3198f 100644
--- a/src/cmd/ld/lib.h
+++ b/src/cmd/ld/lib.h
@@ -208,3 +208,34 @@ enum {
ArchiveObj,
Pkgdef
};
+
+/* executable header types */
+enum {
+ Hgarbunix = 0, // garbage unix
+ Hnoheader, // no header
+ Hunixcoff, // unix coff
+ Hrisc, // aif for risc os
+ Hplan9x32, // plan 9 32-bit format
+ Hplan9x64, // plan 9 64-bit format
+ Hmsdoscom, // MS-DOS .COM
+ Hnetbsd, // NetBSD
+ Hmsdosexe, // fake MS-DOS .EXE
+ Hixp1200, // IXP1200 (raw)
+ Helf, // ELF32
+ Hipaq, // ipaq
+ Hdarwin, // Apple Mach-O
+ Hlinux, // Linux ELF
+ Hnacl, // Google Native Client
+ Hfreebsd, // FreeBSD ELF
+ Hwindows, // MS Windows PE
+ Htiny // tiny (os image)
+};
+
+typedef struct Header Header;
+struct Header {
+ char *name;
+ int val;
+};
+
+extern Header headers[];
+int headtype(char*);