|
38 | 38 | #define PADDR(a) ((uint32)(a) & ~0x80000000) |
39 | 39 |
|
40 | 40 | char linuxdynld[] = "/lib64/ld-linux-x86-64.so.2"; |
| 41 | +char freebsddynld[] = "/libexec/ld-elf.so.1"; |
41 | 42 |
|
42 | 43 | char zeroes[32]; |
43 | 44 |
|
@@ -284,7 +285,7 @@ doelf(void) |
284 | 285 | Sym *s, *shstrtab, *dynamic, *dynstr, *d; |
285 | 286 | int h, nsym, t; |
286 | 287 |
|
287 | | - if(HEADTYPE != 7) |
| 288 | + if(HEADTYPE != 7 && HEADTYPE != 9) |
288 | 289 | return; |
289 | 290 |
|
290 | 291 | /* predefine strings we need for section headers */ |
@@ -317,7 +318,14 @@ doelf(void) |
317 | 318 | s = lookup(".interp", 0); |
318 | 319 | s->reachable = 1; |
319 | 320 | s->type = SDATA; // TODO: rodata |
320 | | - addstring(lookup(".interp", 0), linuxdynld); |
| 321 | + switch(HEADTYPE) { |
| 322 | + case 7: |
| 323 | + addstring(lookup(".interp", 0), linuxdynld); |
| 324 | + break; |
| 325 | + case 9: |
| 326 | + addstring(lookup(".interp", 0), freebsddynld); |
| 327 | + break; |
| 328 | + } |
321 | 329 |
|
322 | 330 | /* |
323 | 331 | * hash table. |
@@ -512,6 +520,7 @@ asmb(void) |
512 | 520 | break; |
513 | 521 |
|
514 | 522 | case 7: |
| 523 | + case 9: |
515 | 524 | debug['8'] = 1; /* 64-bit addresses */ |
516 | 525 | v = rnd(HEADR+textsize, INITRND); |
517 | 526 | seek(cout, v, 0); |
@@ -565,6 +574,7 @@ asmb(void) |
565 | 574 | symo = rnd(HEADR+textsize, INITRND)+rnd(datsize, INITRND)+machlink; |
566 | 575 | break; |
567 | 576 | case 7: |
| 577 | + case 9: |
568 | 578 | symo = rnd(HEADR+textsize, INITRND)+datsize; |
569 | 579 | symo = rnd(symo, INITRND); |
570 | 580 | break; |
@@ -649,6 +659,7 @@ asmb(void) |
649 | 659 | asmbmacho(symdatva, symo); |
650 | 660 | break; |
651 | 661 | case 7: |
| 662 | + case 9: |
652 | 663 | /* elf amd-64 */ |
653 | 664 |
|
654 | 665 | eh = getElfEhdr(); |
@@ -871,6 +882,8 @@ asmb(void) |
871 | 882 | eh->ident[EI_MAG1] = 'E'; |
872 | 883 | eh->ident[EI_MAG2] = 'L'; |
873 | 884 | eh->ident[EI_MAG3] = 'F'; |
| 885 | + if(HEADTYPE == 9) |
| 886 | + eh->ident[EI_OSABI] = 9; |
874 | 887 | eh->ident[EI_CLASS] = ELFCLASS64; |
875 | 888 | eh->ident[EI_DATA] = ELFDATA2LSB; |
876 | 889 | eh->ident[EI_VERSION] = EV_CURRENT; |
|
0 commit comments