aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm-gen.c2
-rw-r--r--c67-gen.c2
-rw-r--r--i386-gen.c2
-rw-r--r--il-gen.c2
-rw-r--r--tccelf.c10
-rw-r--r--tccpe.c220
-rw-r--r--tccpp.c7
-rw-r--r--x86_64-gen.c6
8 files changed, 126 insertions, 125 deletions
diff --git a/arm-gen.c b/arm-gen.c
index 42feecf..9370db5 100644
--- a/arm-gen.c
+++ b/arm-gen.c
@@ -75,7 +75,7 @@ enum {
#endif
};
-int reg_classes[NB_REGS] = {
+const int reg_classes[NB_REGS] = {
/* r0 */ RC_INT | RC_R0,
/* r1 */ RC_INT | RC_R1,
/* r2 */ RC_INT | RC_R2,
diff --git a/c67-gen.c b/c67-gen.c
index 04f8a12..a60b6bf 100644
--- a/c67-gen.c
+++ b/c67-gen.c
@@ -85,7 +85,7 @@ enum {
TREG_C67_B13,
};
-int reg_classes[NB_REGS] = {
+const int reg_classes[NB_REGS] = {
/* eax */ RC_INT | RC_FLOAT | RC_EAX,
// only allow even regs for floats (allow for doubles)
/* ecx */ RC_INT | RC_ECX,
diff --git a/i386-gen.c b/i386-gen.c
index 2edbe2f..61f9e78 100644
--- a/i386-gen.c
+++ b/i386-gen.c
@@ -42,7 +42,7 @@ enum {
TREG_ST0,
};
-int reg_classes[NB_REGS] = {
+const int reg_classes[NB_REGS] = {
/* eax */ RC_INT | RC_EAX,
/* ecx */ RC_INT | RC_ECX,
/* edx */ RC_INT | RC_EDX,
diff --git a/il-gen.c b/il-gen.c
index 29f0526..61bc98d 100644
--- a/il-gen.c
+++ b/il-gen.c
@@ -41,7 +41,7 @@ enum {
REG_ST2,
};
-int reg_classes[NB_REGS] = {
+const int reg_classes[NB_REGS] = {
/* ST0 */ RC_ST | RC_ST0,
/* ST1 */ RC_ST | RC_ST1,
/* ST2 */ RC_ST,
diff --git a/tccelf.c b/tccelf.c
index 826e8e0..e114f42 100644
--- a/tccelf.c
+++ b/tccelf.c
@@ -1283,15 +1283,15 @@ static void tcc_add_linker_symbols(TCCState *s1)
/* name of ELF interpreter */
#if defined __FreeBSD__
-static char elf_interp[] = "/usr/libexec/ld-elf.so.1";
+static const char elf_interp[] = "/usr/libexec/ld-elf.so.1";
#elif defined TCC_ARM_EABI
-static char elf_interp[] = "/lib/ld-linux.so.3";
+static const char elf_interp[] = "/lib/ld-linux.so.3";
#elif defined(TCC_TARGET_X86_64)
-static char elf_interp[] = "/lib/ld-linux-x86-64.so.2";
+static const char elf_interp[] = "/lib/ld-linux-x86-64.so.2";
#elif defined(TCC_UCLIBC)
-static char elf_interp[] = "/lib/ld-uClibc.so.0";
+static const char elf_interp[] = "/lib/ld-uClibc.so.0";
#else
-static char elf_interp[] = "/lib/ld-linux.so.2";
+static const char elf_interp[] = "/lib/ld-linux.so.2";
#endif
static void tcc_output_binary(TCCState *s1, FILE *f,
diff --git a/tccpe.c b/tccpe.c
index 652ab06..285d689 100644
--- a/tccpe.c
+++ b/tccpe.c
@@ -274,106 +274,6 @@ struct pe_rsrc_reloc {
#pragma pack(pop)
-/* ----------------------------------------------------------- */
-ST_DATA struct pe_header pe_header = {
-{
- /* IMAGE_DOS_HEADER doshdr */
- 0x5A4D, /*WORD e_magic; Magic number */
- 0x0090, /*WORD e_cblp; Bytes on last page of file */
- 0x0003, /*WORD e_cp; Pages in file */
- 0x0000, /*WORD e_crlc; Relocations */
-
- 0x0004, /*WORD e_cparhdr; Size of header in paragraphs */
- 0x0000, /*WORD e_minalloc; Minimum extra paragraphs needed */
- 0xFFFF, /*WORD e_maxalloc; Maximum extra paragraphs needed */
- 0x0000, /*WORD e_ss; Initial (relative) SS value */
-
- 0x00B8, /*WORD e_sp; Initial SP value */
- 0x0000, /*WORD e_csum; Checksum */
- 0x0000, /*WORD e_ip; Initial IP value */
- 0x0000, /*WORD e_cs; Initial (relative) CS value */
- 0x0040, /*WORD e_lfarlc; File address of relocation table */
- 0x0000, /*WORD e_ovno; Overlay number */
- {0,0,0,0}, /*WORD e_res[4]; Reserved words */
- 0x0000, /*WORD e_oemid; OEM identifier (for e_oeminfo) */
- 0x0000, /*WORD e_oeminfo; OEM information; e_oemid specific */
- {0,0,0,0,0,0,0,0,0,0}, /*WORD e_res2[10]; Reserved words */
- 0x00000080 /*DWORD e_lfanew; File address of new exe header */
-},{
- /* BYTE dosstub[0x40] */
- /* 14 code bytes + "This program cannot be run in DOS mode.\r\r\n$" + 6 * 0x00 */
- 0x0e,0x1f,0xba,0x0e,0x00,0xb4,0x09,0xcd,0x21,0xb8,0x01,0x4c,0xcd,0x21,0x54,0x68,
- 0x69,0x73,0x20,0x70,0x72,0x6f,0x67,0x72,0x61,0x6d,0x20,0x63,0x61,0x6e,0x6e,0x6f,
- 0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6e,0x20,0x69,0x6e,0x20,0x44,0x4f,0x53,0x20,
- 0x6d,0x6f,0x64,0x65,0x2e,0x0d,0x0d,0x0a,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-},
- 0x00004550, /* DWORD nt_sig = IMAGE_NT_SIGNATURE */
-{
- /* IMAGE_FILE_HEADER filehdr */
-#ifdef TCC_TARGET_X86_64
- 0x8664, /*WORD Machine; */
-#else
- 0x014C, /*WORD Machine; */
-#endif
- 0x0003, /*WORD NumberOfSections; */
- 0x00000000, /*DWORD TimeDateStamp; */
- 0x00000000, /*DWORD PointerToSymbolTable; */
- 0x00000000, /*DWORD NumberOfSymbols; */
-#ifdef TCC_TARGET_X86_64
- 0x00F0, /*WORD SizeOfOptionalHeader; */
- 0x022F /*WORD Characteristics; */
-#define CHARACTERISTICS_DLL 0x222E
-#else
- 0x00E0, /*WORD SizeOfOptionalHeader; */
- 0x030F /*WORD Characteristics; */
-#define CHARACTERISTICS_DLL 0x230E
-#endif
-},{
- /* IMAGE_OPTIONAL_HEADER opthdr */
- /* Standard fields. */
-#ifdef TCC_TARGET_X86_64
- 0x020B, /*WORD Magic; */
-#else
- 0x010B, /*WORD Magic; */
-#endif
- 0x06, /*BYTE MajorLinkerVersion; */
- 0x00, /*BYTE MinorLinkerVersion; */
- 0x00000000, /*DWORD SizeOfCode; */
- 0x00000000, /*DWORD SizeOfInitializedData; */
- 0x00000000, /*DWORD SizeOfUninitializedData; */
- 0x00000000, /*DWORD AddressOfEntryPoint; */
- 0x00000000, /*DWORD BaseOfCode; */
-#ifndef TCC_TARGET_X86_64
- 0x00000000, /*DWORD BaseOfData; */
-#endif
- /* NT additional fields. */
- 0x00400000, /*DWORD ImageBase; */
- 0x00001000, /*DWORD SectionAlignment; */
- 0x00000200, /*DWORD FileAlignment; */
- 0x0004, /*WORD MajorOperatingSystemVersion; */
- 0x0000, /*WORD MinorOperatingSystemVersion; */
- 0x0000, /*WORD MajorImageVersion; */
- 0x0000, /*WORD MinorImageVersion; */
- 0x0004, /*WORD MajorSubsystemVersion; */
- 0x0000, /*WORD MinorSubsystemVersion; */
- 0x00000000, /*DWORD Win32VersionValue; */
- 0x00000000, /*DWORD SizeOfImage; */
- 0x00000200, /*DWORD SizeOfHeaders; */
- 0x00000000, /*DWORD CheckSum; */
- 0x0002, /*WORD Subsystem; */
- 0x0000, /*WORD DllCharacteristics; */
- 0x00100000, /*DWORD SizeOfStackReserve; */
- 0x00001000, /*DWORD SizeOfStackCommit; */
- 0x00100000, /*DWORD SizeOfHeapReserve; */
- 0x00001000, /*DWORD SizeOfHeapCommit; */
- 0x00000000, /*DWORD LoaderFlags; */
- 0x00000010, /*DWORD NumberOfRvaAndSizes; */
-
- /* IMAGE_DATA_DIRECTORY DataDirectory[16]; */
- {{0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
- {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}}
-}};
-
/* ------------------------------------------------------------- */
/* internal temporary structures */
@@ -400,7 +300,7 @@ enum {
sec_last
};
-ST_DATA DWORD pe_sec_flags[] = {
+ST_DATA const DWORD pe_sec_flags[] = {
0x60000020, /* ".text" , */
0xC0000040, /* ".data" , */
0xC0000080, /* ".bss" , */
@@ -541,18 +441,118 @@ ST_FN void pe_align_section(Section *s, int a)
section_ptr_add(s, a - i);
}
-ST_FN void pe_set_datadir(int dir, DWORD addr, DWORD size)
+ST_FN void pe_set_datadir(struct pe_header *hdr, int dir, DWORD addr, DWORD size)
{
- pe_header.opthdr.DataDirectory[dir].VirtualAddress = addr;
- pe_header.opthdr.DataDirectory[dir].Size = size;
+ hdr->opthdr.DataDirectory[dir].VirtualAddress = addr;
+ hdr->opthdr.DataDirectory[dir].Size = size;
}
/*----------------------------------------------------------------------------*/
ST_FN int pe_write(struct pe_info *pe)
{
+ static const struct pe_header pe_template = {
+ {
+ /* IMAGE_DOS_HEADER doshdr */
+ 0x5A4D, /*WORD e_magic; Magic number */
+ 0x0090, /*WORD e_cblp; Bytes on last page of file */
+ 0x0003, /*WORD e_cp; Pages in file */
+ 0x0000, /*WORD e_crlc; Relocations */
+
+ 0x0004, /*WORD e_cparhdr; Size of header in paragraphs */
+ 0x0000, /*WORD e_minalloc; Minimum extra paragraphs needed */
+ 0xFFFF, /*WORD e_maxalloc; Maximum extra paragraphs needed */
+ 0x0000, /*WORD e_ss; Initial (relative) SS value */
+
+ 0x00B8, /*WORD e_sp; Initial SP value */
+ 0x0000, /*WORD e_csum; Checksum */
+ 0x0000, /*WORD e_ip; Initial IP value */
+ 0x0000, /*WORD e_cs; Initial (relative) CS value */
+ 0x0040, /*WORD e_lfarlc; File address of relocation table */
+ 0x0000, /*WORD e_ovno; Overlay number */
+ {0,0,0,0}, /*WORD e_res[4]; Reserved words */
+ 0x0000, /*WORD e_oemid; OEM identifier (for e_oeminfo) */
+ 0x0000, /*WORD e_oeminfo; OEM information; e_oemid specific */
+ {0,0,0,0,0,0,0,0,0,0}, /*WORD e_res2[10]; Reserved words */
+ 0x00000080 /*DWORD e_lfanew; File address of new exe header */
+ },{
+ /* BYTE dosstub[0x40] */
+ /* 14 code bytes + "This program cannot be run in DOS mode.\r\r\n$" + 6 * 0x00 */
+ 0x0e,0x1f,0xba,0x0e,0x00,0xb4,0x09,0xcd,0x21,0xb8,0x01,0x4c,0xcd,0x21,0x54,0x68,
+ 0x69,0x73,0x20,0x70,0x72,0x6f,0x67,0x72,0x61,0x6d,0x20,0x63,0x61,0x6e,0x6e,0x6f,
+ 0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6e,0x20,0x69,0x6e,0x20,0x44,0x4f,0x53,0x20,
+ 0x6d,0x6f,0x64,0x65,0x2e,0x0d,0x0d,0x0a,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ },
+ 0x00004550, /* DWORD nt_sig = IMAGE_NT_SIGNATURE */
+ {
+ /* IMAGE_FILE_HEADER filehdr */
+#ifdef TCC_TARGET_X86_64
+ 0x8664, /*WORD Machine; */
+#else
+ 0x014C, /*WORD Machine; */
+#endif
+ 0x0003, /*WORD NumberOfSections; */
+ 0x00000000, /*DWORD TimeDateStamp; */
+ 0x00000000, /*DWORD PointerToSymbolTable; */
+ 0x00000000, /*DWORD NumberOfSymbols; */
+#ifdef TCC_TARGET_X86_64
+ 0x00F0, /*WORD SizeOfOptionalHeader; */
+ 0x022F /*WORD Characteristics; */
+#define CHARACTERISTICS_DLL 0x222E
+#else
+ 0x00E0, /*WORD SizeOfOptionalHeader; */
+ 0x030F /*WORD Characteristics; */
+#define CHARACTERISTICS_DLL 0x230E
+#endif
+},{
+ /* IMAGE_OPTIONAL_HEADER opthdr */
+ /* Standard fields. */
+#ifdef TCC_TARGET_X86_64
+ 0x020B, /*WORD Magic; */
+#else
+ 0x010B, /*WORD Magic; */
+#endif
+ 0x06, /*BYTE MajorLinkerVersion; */
+ 0x00, /*BYTE MinorLinkerVersion; */
+ 0x00000000, /*DWORD SizeOfCode; */
+ 0x00000000, /*DWORD SizeOfInitializedData; */
+ 0x00000000, /*DWORD SizeOfUninitializedData; */
+ 0x00000000, /*DWORD AddressOfEntryPoint; */
+ 0x00000000, /*DWORD BaseOfCode; */
+#ifndef TCC_TARGET_X86_64
+ 0x00000000, /*DWORD BaseOfData; */
+#endif
+ /* NT additional fields. */
+ 0x00400000, /*DWORD ImageBase; */
+ 0x00001000, /*DWORD SectionAlignment; */
+ 0x00000200, /*DWORD FileAlignment; */
+ 0x0004, /*WORD MajorOperatingSystemVersion; */
+ 0x0000, /*WORD MinorOperatingSystemVersion; */
+ 0x0000, /*WORD MajorImageVersion; */
+ 0x0000, /*WORD MinorImageVersion; */
+ 0x0004, /*WORD MajorSubsystemVersion; */
+ 0x0000, /*WORD MinorSubsystemVersion; */
+ 0x00000000, /*DWORD Win32VersionValue; */
+ 0x00000000, /*DWORD SizeOfImage; */
+ 0x00000200, /*DWORD SizeOfHeaders; */
+ 0x00000000, /*DWORD CheckSum; */
+ 0x0002, /*WORD Subsystem; */
+ 0x0000, /*WORD DllCharacteristics; */
+ 0x00100000, /*DWORD SizeOfStackReserve; */
+ 0x00001000, /*DWORD SizeOfStackCommit; */
+ 0x00100000, /*DWORD SizeOfHeapReserve; */
+ 0x00001000, /*DWORD SizeOfHeapCommit; */
+ 0x00000000, /*DWORD LoaderFlags; */
+ 0x00000010, /*DWORD NumberOfRvaAndSizes; */
+
+ /* IMAGE_DATA_DIRECTORY DataDirectory[16]; */
+ {{0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
+ {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}}
+ }};
+
int i;
FILE *op;
DWORD file_offset, r;
+ struct pe_header pe_header = pe_template;
op = fopen(pe->filename, "wb");
if (NULL == op) {
@@ -561,7 +561,7 @@ ST_FN int pe_write(struct pe_info *pe)
}
pe->sizeofheaders = pe_file_align(
- sizeof pe_header
+ sizeof (struct pe_header)
+ pe->sec_count * sizeof (IMAGE_SECTION_HEADER)
);
@@ -599,11 +599,11 @@ ST_FN int pe_write(struct pe_info *pe)
break;
case sec_reloc:
- pe_set_datadir(IMAGE_DIRECTORY_ENTRY_BASERELOC, addr, size);
+ pe_set_datadir(&pe_header, IMAGE_DIRECTORY_ENTRY_BASERELOC, addr, size);
break;
case sec_rsrc:
- pe_set_datadir(IMAGE_DIRECTORY_ENTRY_RESOURCE, addr, size);
+ pe_set_datadir(&pe_header, IMAGE_DIRECTORY_ENTRY_RESOURCE, addr, size);
break;
case sec_stab:
@@ -612,13 +612,13 @@ ST_FN int pe_write(struct pe_info *pe)
if (pe->thunk == pe->s1->sections[si->ord]) {
if (pe->imp_size) {
- pe_set_datadir(IMAGE_DIRECTORY_ENTRY_IMPORT,
+ pe_set_datadir(&pe_header, IMAGE_DIRECTORY_ENTRY_IMPORT,
pe->imp_offs + addr, pe->imp_size);
- pe_set_datadir(IMAGE_DIRECTORY_ENTRY_IAT,
+ pe_set_datadir(&pe_header, IMAGE_DIRECTORY_ENTRY_IAT,
pe->iat_offs + addr, pe->iat_size);
}
if (pe->exp_size) {
- pe_set_datadir(IMAGE_DIRECTORY_ENTRY_EXPORT,
+ pe_set_datadir(&pe_header, IMAGE_DIRECTORY_ENTRY_EXPORT,
pe->exp_offs + addr, pe->exp_size);
}
}
diff --git a/tccpp.c b/tccpp.c
index 25b6cbb..0d00cbc 100644
--- a/tccpp.c
+++ b/tccpp.c
@@ -26,7 +26,9 @@ static const char tcc_keywords[] =
;
/* WARNING: the content of this string encodes token numbers */
-static char tok_two_chars[] = "<=\236>=\235!=\225&&\240||\241++\244--\242==\224<<\1>>\2+=\253-=\255*=\252/=\257%=\245&=\246^=\336|=\374->\313..\250##\266";
+static const unsigned char tok_two_chars[] =
+ "<=\236>=\235!=\225&&\240||\241++\244--\242==\224<<\1>>\2+=\253"
+ "-=\255*=\252/=\257%=\245&=\246^=\336|=\374->\313..\250##\266";
/* true if isid(c) || isnum(c) */
static unsigned char isidnum_table[256-CH_EOF];
@@ -110,7 +112,6 @@ char *get_tok_str(int v, CValue *cv)
static char buf[STRING_MAX_SIZE + 1];
static CString cstr_buf;
CString *cstr;
- unsigned char *q;
char *p;
int i, len;
@@ -182,7 +183,7 @@ char *get_tok_str(int v, CValue *cv)
default:
if (v < TOK_IDENT) {
/* search in two bytes table */
- q = tok_two_chars;
+ const unsigned char *q = tok_two_chars;
while (*q) {
if (q[2] == v) {
*p++ = q[0];
diff --git a/x86_64-gen.c b/x86_64-gen.c
index 593cd61..1739e95 100644
--- a/x86_64-gen.c
+++ b/x86_64-gen.c
@@ -60,7 +60,7 @@ enum {
#define REX_BASE(reg) (((reg) >> 3) & 1)
#define REG_VALUE(reg) ((reg) & 7)
-int reg_classes[NB_REGS] = {
+const int reg_classes[NB_REGS] = {
/* eax */ RC_INT | RC_RAX,
/* ecx */ RC_INT | RC_RCX,
/* edx */ RC_INT | RC_RDX,
@@ -535,12 +535,12 @@ static void gcall_or_jmp(int is_jmp)
#ifdef TCC_TARGET_PE
#define REGN 4
-static uint8_t arg_regs[] = {
+static const uint8_t arg_regs[] = {
TREG_RCX, TREG_RDX, TREG_R8, TREG_R9
};
#else
#define REGN 6
-static uint8_t arg_regs[REGN] = {
+static const uint8_t arg_regs[REGN] = {
TREG_RDI, TREG_RSI, TREG_RDX, TREG_RCX, TREG_R8, TREG_R9
};
#endif