diff options
| author | Alex Brainman <alex.brainman@gmail.com> | 2011-02-23 14:30:40 +1100 |
|---|---|---|
| committer | Alex Brainman <alex.brainman@gmail.com> | 2011-02-23 14:30:40 +1100 |
| commit | 0cf6f8c096e8482da62ffa264ba6929f9179945e (patch) | |
| tree | 352a215bc65de99ccab93ce279912a1b766eefc3 /src/cmd/ld | |
| parent | cd0f799e65619c30e984c03b905507ff0216e825 (diff) | |
| download | go-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.c | 6 | ||||
| -rw-r--r-- | src/cmd/ld/dwarf.c | 2 | ||||
| -rw-r--r-- | src/cmd/ld/lib.c | 13 | ||||
| -rw-r--r-- | src/cmd/ld/lib.h | 31 |
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*); |
