| @@ -503,23 +503,29 @@ ST_FN int pe_write(struct pe_info *pe) · 502 unmodified lines |
| 503 | 503 | 0x00004550, /* DWORD nt_sig = IMAGE_NT_SIGNATURE */ |
| 504 | 504 | { |
| 505 | 505 | /* IMAGE_FILE_HEADER filehdr */ |
| 506 | | −#ifdef TCC_TARGET_X86_64 |
| 507 | | − 0x8664, /*WORD Machine; */ |
| 508 | | −#else |
| 509 | | − 0x014C, /*WORD Machine; */ |
| 506 | +#if defined(TCC_TARGET_I386) |
| 507 | + 0x014C, /*WORD Machine; */ |
| 508 | +#elif defined(TCC_TARGET_X86_64) |
| 509 | + 0x8664, /*WORD Machine; */ |
| 510 | +#elif defined(TCC_TARGET_ARM) |
| 511 | + 0x01C0, /*WORD Machine; */ |
| 510 | 512 | #endif |
| 511 | 513 | 0x0003, /*WORD NumberOfSections; */ |
| 512 | 514 | 0x00000000, /*DWORD TimeDateStamp; */ |
| 513 | 515 | 0x00000000, /*DWORD PointerToSymbolTable; */ |
| 514 | 516 | 0x00000000, /*DWORD NumberOfSymbols; */ |
| 515 | | −#ifdef TCC_TARGET_X86_64 |
| 517 | +#if defined(TCC_TARGET_X86_64) |
| 516 | 518 | 0x00F0, /*WORD SizeOfOptionalHeader; */ |
| 517 | 519 | 0x022F /*WORD Characteristics; */ |
| 518 | 520 | #define CHARACTERISTICS_DLL 0x222E |
| 519 | | −#else |
| 521 | +#elif defined(TCC_TARGET_I386) |
| 520 | 522 | 0x00E0, /*WORD SizeOfOptionalHeader; */ |
| 521 | 523 | 0x030F /*WORD Characteristics; */ |
| 522 | 524 | #define CHARACTERISTICS_DLL 0x230E |
| 525 | +#elif defined(TCC_TARGET_ARM) |
| 526 | + 0x00E0, /*WORD SizeOfOptionalHeader; */ |
| 527 | + 0x010F, /*WORD Characteristics; */ |
| 528 | +#define CHARACTERISTICS_DLL 0x230F |
| 523 | 529 | #endif |
| 524 | 530 | },{ |
| 525 | 531 | /* IMAGE_OPTIONAL_HEADER opthdr */ |
| @@ -540,7 +546,11 @@ ST_FN int pe_write(struct pe_info *pe) · 14 unmodified lines |
| 540 | 546 | 0x00000000, /*DWORD BaseOfData; */ |
| 541 | 547 | #endif |
| 542 | 548 | /* NT additional fields. */ |
| 543 | | − 0x00400000, /*DWORD ImageBase; */ |
| 549 | +#if defined(TCC_TARGET_ARM) |
| 550 | + 0x00100000, /*DWORD ImageBase; */ |
| 551 | +#else |
| 552 | + 0x00400000, /*DWORD ImageBase; */ |
| 553 | +#endif |
| 544 | 554 | 0x00001000, /*DWORD SectionAlignment; */ |
| 545 | 555 | 0x00000200, /*DWORD FileAlignment; */ |
| 546 | 556 | 0x0004, /*WORD MajorOperatingSystemVersion; */ |
| @@ -699,7 +709,7 @@ ST_FN int pe_write(struct pe_info *pe) · 152 unmodified lines |
| 699 | 709 | |
| 700 | 710 | /*----------------------------------------------------------------------------*/ |
| 701 | 711 | |
| 702 | | −#ifdef TCC_TARGET_X86_64 |
| 712 | +#if defined(TCC_TARGET_X86_64) |
| 703 | 713 | #define ELFW_R_(type) ELF64_R_##type |
| 704 | 714 | #define ElfW_Rel ElfW(Rela) |
| 705 | 715 | |
| @@ -710,7 +720,7 @@ ST_FN int pe_write(struct pe_info *pe) · 4 unmodified lines |
| 710 | 720 | #define ELFW_ST_BIND ELF64_ST_BIND |
| 711 | 721 | #define ELFW_ST_TYPE ELF64_ST_TYPE |
| 712 | 722 | #define ELFW_ST_INFO ELF64_ST_INFO |
| 713 | | −#else |
| 723 | +#elif defined(TCC_TARGET_I386) |
| 714 | 724 | #define ELFW_R_(type) ELF32_R_##type |
| 715 | 725 | #define ElfW_Rel ElfW(Rel) |
| 716 | 726 | |
| @@ -718,6 +728,17 @@ ST_FN int pe_write(struct pe_info *pe) · 1 unmodified line |
| 718 | 728 | #define R_XXX_THUNKFIX R_386_32 |
| 719 | 729 | #define R_XXX_RELATIVE R_386_RELATIVE |
| 720 | 730 | |
| 731 | +#define ELFW_ST_BIND ELF32_ST_BIND |
| 732 | +#define ELFW_ST_TYPE ELF32_ST_TYPE |
| 733 | +#define ELFW_ST_INFO ELF32_ST_INFO |
| 734 | +#elif defined(TCC_TARGET_ARM) |
| 735 | +#define ELFW_R_(type) ELF32_R_##type |
| 736 | +#define ElfW_Rel ElfW(Rel) |
| 737 | + |
| 738 | +#define REL_TYPE_DIRECT R_ARM_ABS32 |
| 739 | +#define R_XXX_THUNKFIX R_ARM_ABS32 |
| 740 | +#define R_XXX_RELATIVE R_ARM_RELATIVE |
| 741 | + |
| 721 | 742 | #define ELFW_ST_BIND ELF32_ST_BIND |
| 722 | 743 | #define ELFW_ST_TYPE ELF32_ST_TYPE |
| 723 | 744 | #define ELFW_ST_INFO ELF32_ST_INFO |
| @@ -1648,17 +1669,25 @@ PUB_FN int pe_output_file(TCCState * s1, const char *filename) · 924 unmodified lines |
| 1648 | 1669 | if (filename) { |
| 1649 | 1670 | if (PE_DLL == pe.type) { |
| 1650 | 1671 | pe.reloc = new_section(pe.s1, ".reloc", SHT_PROGBITS, 0); |
| 1672 | + /* XXX: check if is correct for arm-pe target */ |
| 1651 | 1673 | pe.imagebase = 0x10000000; |
| 1652 | 1674 | } else { |
| 1675 | +#if defined(TCC_TARGET_ARM) |
| 1676 | + pe.imagebase = 0x00010000; |
| 1677 | +#else |
| 1653 | 1678 | pe.imagebase = 0x00400000; |
| 1679 | +#endif |
| 1654 | 1680 | } |
| 1655 | 1681 | |
| 1656 | 1682 | /* if no subsystem specified, we use "console" subsystem by default */ |
| 1657 | 1683 | if (s1->pe_subsystem != 0) |
| 1658 | 1684 | pe.subsystem = s1->pe_subsystem; |
| 1659 | 1685 | else |
| 1686 | +#if defined(TCC_TARGET_ARM) |
| 1660 | 1687 | pe.subsystem = 3; |
| 1661 | | − |
| 1688 | +#else |
| 1689 | + pe.subsystem = 9; |
| 1690 | +#endif |
| 1662 | 1691 | /* set default file/section alignment */ |
| 1663 | 1692 | if (pe.subsystem == 1) { |
| 1664 | 1693 | pe.section_align = 0x20; |