LEFT | RIGHT |
(no file at all) | |
1 // Copyright 2009 The Go Authors. All rights reserved. | 1 // Copyright 2009 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 #include "l.h" | 5 #include "l.h" |
6 #include "lib.h" | 6 #include "lib.h" |
7 #include "../ld/elf.h" | 7 #include "../ld/elf.h" |
8 | 8 |
9 /* | 9 /* |
10 * We use the 64-bit data structures on both 32- and 64-bit machines | 10 * We use the 64-bit data structures on both 32- and 64-bit machines |
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 addstring(shstrtab, ".noptrbss"); | 787 addstring(shstrtab, ".noptrbss"); |
788 if(HEADTYPE == Hnetbsd) | 788 if(HEADTYPE == Hnetbsd) |
789 addstring(shstrtab, ".note.netbsd.ident"); | 789 addstring(shstrtab, ".note.netbsd.ident"); |
790 if(HEADTYPE == Hopenbsd) | 790 if(HEADTYPE == Hopenbsd) |
791 addstring(shstrtab, ".note.openbsd.ident"); | 791 addstring(shstrtab, ".note.openbsd.ident"); |
792 if(buildinfolen > 0) | 792 if(buildinfolen > 0) |
793 addstring(shstrtab, ".note.gnu.build-id"); | 793 addstring(shstrtab, ".note.gnu.build-id"); |
794 addstring(shstrtab, ".elfdata"); | 794 addstring(shstrtab, ".elfdata"); |
795 addstring(shstrtab, ".rodata"); | 795 addstring(shstrtab, ".rodata"); |
796 addstring(shstrtab, ".typelink"); | 796 addstring(shstrtab, ".typelink"); |
| 797 if(flag_shared) |
| 798 addstring(shstrtab, ".data.rel.ro"); |
797 addstring(shstrtab, ".gcdata"); | 799 addstring(shstrtab, ".gcdata"); |
798 addstring(shstrtab, ".gcbss"); | 800 addstring(shstrtab, ".gcbss"); |
799 addstring(shstrtab, ".gosymtab"); | 801 addstring(shstrtab, ".gosymtab"); |
800 addstring(shstrtab, ".gopclntab"); | 802 addstring(shstrtab, ".gopclntab"); |
801 | 803 |
802 if(!debug['s']) { | 804 if(!debug['s']) { |
803 addstring(shstrtab, ".symtab"); | 805 addstring(shstrtab, ".symtab"); |
804 addstring(shstrtab, ".strtab"); | 806 addstring(shstrtab, ".strtab"); |
805 dwarfaddshstrings(shstrtab); | 807 dwarfaddshstrings(shstrtab); |
806 } | 808 } |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 elfwritedynent(s, DT_PLTREL, DT_RELA); | 921 elfwritedynent(s, DT_PLTREL, DT_RELA); |
920 elfwritedynentsymsize(s, DT_PLTRELSZ, lookup(".rela.plt"
, 0)); | 922 elfwritedynentsymsize(s, DT_PLTRELSZ, lookup(".rela.plt"
, 0)); |
921 elfwritedynentsym(s, DT_JMPREL, lookup(".rela.plt", 0)); | 923 elfwritedynentsym(s, DT_JMPREL, lookup(".rela.plt", 0)); |
922 } else { | 924 } else { |
923 elfwritedynent(s, DT_PLTREL, DT_REL); | 925 elfwritedynent(s, DT_PLTREL, DT_REL); |
924 elfwritedynentsymsize(s, DT_PLTRELSZ, lookup(".rel.plt",
0)); | 926 elfwritedynentsymsize(s, DT_PLTRELSZ, lookup(".rel.plt",
0)); |
925 elfwritedynentsym(s, DT_JMPREL, lookup(".rel.plt", 0)); | 927 elfwritedynentsym(s, DT_JMPREL, lookup(".rel.plt", 0)); |
926 } | 928 } |
927 ················ | 929 ················ |
928 elfwritedynent(s, DT_DEBUG, 0); | 930 elfwritedynent(s, DT_DEBUG, 0); |
| 931 |
| 932 if(flag_shared) { |
| 933 Sym *init_sym = lookup(LIBINITENTRY, 0); |
| 934 if(init_sym->type != STEXT) |
| 935 diag("entry not text: %s", init_sym->name); |
| 936 elfwritedynentsym(s, DT_INIT, init_sym); |
| 937 } |
929 | 938 |
930 // Do not write DT_NULL. elfdynhash will finish it. | 939 // Do not write DT_NULL. elfdynhash will finish it. |
931 } | 940 } |
932 } | 941 } |
933 | 942 |
934 void | 943 void |
935 shsym(ElfShdr *sh, Sym *s) | 944 shsym(ElfShdr *sh, Sym *s) |
936 { | 945 { |
937 vlong addr; | 946 vlong addr; |
938 addr = symaddr(s); | 947 addr = symaddr(s); |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1270 eh->ident[EI_OSABI] = ELFOSABI_NETBSD; | 1279 eh->ident[EI_OSABI] = ELFOSABI_NETBSD; |
1271 else if(HEADTYPE == Hopenbsd) | 1280 else if(HEADTYPE == Hopenbsd) |
1272 eh->ident[EI_OSABI] = ELFOSABI_OPENBSD; | 1281 eh->ident[EI_OSABI] = ELFOSABI_OPENBSD; |
1273 if(PtrSize == 8) | 1282 if(PtrSize == 8) |
1274 eh->ident[EI_CLASS] = ELFCLASS64; | 1283 eh->ident[EI_CLASS] = ELFCLASS64; |
1275 else | 1284 else |
1276 eh->ident[EI_CLASS] = ELFCLASS32; | 1285 eh->ident[EI_CLASS] = ELFCLASS32; |
1277 eh->ident[EI_DATA] = ELFDATA2LSB; | 1286 eh->ident[EI_DATA] = ELFDATA2LSB; |
1278 eh->ident[EI_VERSION] = EV_CURRENT; | 1287 eh->ident[EI_VERSION] = EV_CURRENT; |
1279 | 1288 |
1280 » eh->type = ET_EXEC; | 1289 » if(flag_shared) |
| 1290 » » eh->type = ET_DYN; |
| 1291 » else |
| 1292 » » eh->type = ET_EXEC; |
| 1293 |
1281 eh->version = EV_CURRENT; | 1294 eh->version = EV_CURRENT; |
1282 eh->entry = entryvalue(); | 1295 eh->entry = entryvalue(); |
1283 | 1296 |
1284 pph->filesz = eh->phnum * eh->phentsize; | 1297 pph->filesz = eh->phnum * eh->phentsize; |
1285 pph->memsz = pph->filesz; | 1298 pph->memsz = pph->filesz; |
1286 | 1299 |
1287 cseek(0); | 1300 cseek(0); |
1288 a = 0; | 1301 a = 0; |
1289 a += elfwritehdr(); | 1302 a += elfwritehdr(); |
1290 a += elfwritephdrs(); | 1303 a += elfwritephdrs(); |
1291 a += elfwriteshdrs(); | 1304 a += elfwriteshdrs(); |
1292 if(!debug['d']) | 1305 if(!debug['d']) |
1293 a += elfwriteinterp(); | 1306 a += elfwriteinterp(); |
1294 if(HEADTYPE == Hnetbsd) | 1307 if(HEADTYPE == Hnetbsd) |
1295 a += elfwritenetbsdsig(); | 1308 a += elfwritenetbsdsig(); |
1296 if(HEADTYPE == Hopenbsd) | 1309 if(HEADTYPE == Hopenbsd) |
1297 a += elfwriteopenbsdsig(); | 1310 a += elfwriteopenbsdsig(); |
1298 if(buildinfolen > 0) | 1311 if(buildinfolen > 0) |
1299 a += elfwritebuildinfo(); | 1312 a += elfwritebuildinfo(); |
1300 if(a > ELFRESERVE)······ | 1313 if(a > ELFRESERVE)······ |
1301 diag("ELFRESERVE too small: %d > %d", a, ELFRESERVE); | 1314 diag("ELFRESERVE too small: %d > %d", a, ELFRESERVE); |
1302 } | 1315 } |
LEFT | RIGHT |