From a0bc149b0ca2c6b807d3e3de9703e2acfcd52776 Mon Sep 17 00:00:00 2001 From: herman ten brugge Date: Wed, 11 Dec 2019 12:07:48 +0100 Subject: [PATCH] Fix bounds checking after concurrently commit --- i386-gen.c | 20 ++++++++++---------- tcc.h | 2 +- tccelf.c | 2 +- tests/Makefile | 12 ++++++++---- tests/tcctest.c | 6 +----- x86_64-gen.c | 20 ++++++++++---------- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/i386-gen.c b/i386-gen.c index e4f6ddf3..647974f8 100644 --- a/i386-gen.c +++ b/i386-gen.c @@ -1052,7 +1052,7 @@ ST_FUNC void ggoto(void) /* bound check support functions */ #ifdef CONFIG_TCC_BCHECK -ST_FUNC void tcc_add_bcheck(TCCState *s1) +ST_FUNC void tcc_add_bcheck(TCCState *s1, Section *bound_sec, Section *sym_sec) { addr_t *ptr; int loc_glob; @@ -1062,14 +1062,14 @@ ST_FUNC void tcc_add_bcheck(TCCState *s1) if (0 == s1->do_bounds_check) return; /* XXX: add an object file to do that */ - ptr = section_ptr_add(bounds_section, sizeof(*ptr)); + ptr = section_ptr_add(bound_sec, sizeof(*ptr)); *ptr = 0; loc_glob = s1->output_type != TCC_OUTPUT_MEMORY ? STB_LOCAL : STB_GLOBAL; - bsym_index = set_elf_sym(symtab_section, 0, 0, + bsym_index = set_elf_sym(sym_sec, 0, 0, ELFW(ST_INFO)(loc_glob, STT_NOTYPE), 0, - bounds_section->sh_num, "__bounds_start"); + bound_sec->sh_num, "__bounds_start"); /* pull bcheck.o from libtcc1.a */ - sym_index = set_elf_sym(symtab_section, 0, 0, + sym_index = set_elf_sym(sym_sec, 0, 0, ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, SHN_UNDEF, "__bound_init"); if (s1->output_type != TCC_OUTPUT_MEMORY) { @@ -1085,22 +1085,22 @@ ST_FUNC void tcc_add_bcheck(TCCState *s1) pinit = section_ptr_add(init_section, 5); pinit[0] = 0xe8; write32le(pinit + 1, -4); - put_elf_reloc(symtab_section, init_section, + put_elf_reloc(sym_sec, init_section, init_section->data_offset - 4, R_386_PC32, sym_index); /* R_386_PC32 = R_X86_64_PC32 = 2 */ pinit = section_ptr_add(init_section, 6); pinit[0] = 0xb8; /* mov xx,%eax */ write32le(pinit + 1, 0); pinit[5] = 0x50; /* push %eax */ - put_elf_reloc(symtab_section, init_section, + put_elf_reloc(sym_sec, init_section, init_section->data_offset - 5, R_386_32, bsym_index); - sym_index = set_elf_sym(symtab_section, 0, 0, + sym_index = set_elf_sym(sym_sec, 0, 0, ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, SHN_UNDEF, "__bounds_add_static_var"); pinit = section_ptr_add(init_section, 5); pinit[0] = 0xe8; write32le(pinit + 1, -4); - put_elf_reloc(symtab_section, init_section, + put_elf_reloc(sym_sec, init_section, init_section->data_offset - 4, R_386_PC32, sym_index); /* R_386_PC32 = R_X86_64_PC32 = 2 */ pinit = section_ptr_add(init_section, 3); @@ -1109,7 +1109,7 @@ ST_FUNC void tcc_add_bcheck(TCCState *s1) pinit[2] = 0x04; #ifdef TCC_TARGET_PE { - int init_index = set_elf_sym(symtab_section, + int init_index = set_elf_sym(sym_sec, 0, 0, ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, init_section->sh_num, "__init_start"); diff --git a/tcc.h b/tcc.h index db5d6dc9..ca0eef88 100644 --- a/tcc.h +++ b/tcc.h @@ -1249,7 +1249,7 @@ ST_FUNC int tcc_add_crt(TCCState *s, const char *filename); #endif ST_FUNC int tcc_add_dll(TCCState *s, const char *filename, int flags); #ifdef CONFIG_TCC_BCHECK -ST_FUNC void tcc_add_bcheck(TCCState *s1); +ST_FUNC void tcc_add_bcheck(TCCState *s1, Section *bound_sec, Section *sym_sec); #endif ST_FUNC void tcc_add_pragma_libs(TCCState *s1); PUB_FUNC int tcc_add_library_err(TCCState *s, const char *f); diff --git a/tccelf.c b/tccelf.c index 2f149225..1e5b8c31 100644 --- a/tccelf.c +++ b/tccelf.c @@ -1320,7 +1320,7 @@ ST_FUNC void tcc_add_runtime(TCCState *s1) { s1->filetype = 0; #ifdef CONFIG_TCC_BCHECK - tcc_add_bcheck(s1); + tcc_add_bcheck(s1, bounds_section, symtab_section); #endif tcc_add_pragma_libs(s1); #ifndef TCC_TARGET_PE diff --git a/tests/Makefile b/tests/Makefile index 4d9a6f61..85657bde 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -30,11 +30,14 @@ BTESTS = test1b test3b btest # btest -- works on i386 (including win32) # bounds-checking is supported only on i386 -ifneq ($(ARCH),i386) - TESTS := $(filter-out $(BTESTS),$(TESTS)) +ifeq ($(ARCH),i386) + TESTS += $(BTESTS) +endif +ifeq ($(ARCH),x86_64) + TESTS += $(BTESTS) endif ifdef CONFIG_WIN32 - TESTS := $(filter-out $(BTESTS),$(TESTS)) + TESTS += $(BTESTS) endif ifdef CONFIG_OSX # -run only TESTS := hello-run libtest tests2-dir pp-dir @@ -158,7 +161,8 @@ BOUNDS_FAIL= 2 5 6 7 9 11 12 13 15 17 btest: boundtest.c @echo ------------ $@ ------------ - @for i in $(BOUNDS_OK); do \ + @ulimit -c 0; \ + for i in $(BOUNDS_OK); do \ echo ; echo --- boundtest $$i ---; \ if $(TCC) -b -run $< $$i ; then \ echo succeeded as expected; \ diff --git a/tests/tcctest.c b/tests/tcctest.c index 476881a1..2a6fe6a7 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -3886,11 +3886,9 @@ void builtin_frame_address_test(void) printf("str: %s\n", str); #ifndef __riscv -#ifndef __BOUNDS_CHECKING_ON bfa1(str-fp0); #endif #endif -#endif } char via_volatile (char i) @@ -3966,12 +3964,11 @@ int force_get_order(unsigned long s) return __get_order(s); } -#define pv(m) printf(sizeof (s->m + 0) == 8 ? "%016lx\n" : "%02x\n", s->m) +#define pv(m) printf(sizeof (s->m + 0) == 8 ? "%016llx\n" : "%02x\n", s->m) /* Test failed when using bounds checking */ void bounds_check1_test (void) { -#ifndef __arm__ /* gcc bug om arm */ struct s { int x; long long y; @@ -3980,5 +3977,4 @@ void bounds_check1_test (void) s->y = 20; pv(x); pv(y); -#endif } diff --git a/x86_64-gen.c b/x86_64-gen.c index a2b260e9..741ae0ff 100644 --- a/x86_64-gen.c +++ b/x86_64-gen.c @@ -652,7 +652,7 @@ static void gen_bounds_call(int v) #endif } -ST_FUNC void tcc_add_bcheck(TCCState *s1) +ST_FUNC void tcc_add_bcheck(TCCState *s1, Section *bound_sec, Section *sym_sec) { addr_t *ptr; int loc_glob; @@ -662,14 +662,14 @@ ST_FUNC void tcc_add_bcheck(TCCState *s1) if (0 == s1->do_bounds_check) return; /* XXX: add an object file to do that */ - ptr = section_ptr_add(bounds_section, sizeof(*ptr)); + ptr = section_ptr_add(bound_sec, sizeof(*ptr)); *ptr = 0; loc_glob = s1->output_type != TCC_OUTPUT_MEMORY ? STB_LOCAL : STB_GLOBAL; - bsym_index = set_elf_sym(symtab_section, 0, 0, + bsym_index = set_elf_sym(sym_sec, 0, 0, ELFW(ST_INFO)(loc_glob, STT_NOTYPE), 0, - bounds_section->sh_num, "__bounds_start"); + bound_sec->sh_num, "__bounds_start"); /* pull bcheck.o from libtcc1.a */ - sym_index = set_elf_sym(symtab_section, 0, 0, + sym_index = set_elf_sym(sym_sec, 0, 0, ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, SHN_UNDEF, "__bound_init"); if (s1->output_type != TCC_OUTPUT_MEMORY) { @@ -690,7 +690,7 @@ ST_FUNC void tcc_add_bcheck(TCCState *s1) pinit = section_ptr_add(init_section, 5); pinit[0] = 0xe8; write32le(pinit + 1, -4); - put_elf_reloc(symtab_section, init_section, + put_elf_reloc(sym_sec, init_section, init_section->data_offset - 4, R_386_PC32, sym_index); /* R_386_PC32 = R_X86_64_PC32 = 2 */ pinit = section_ptr_add(init_section, 13); @@ -706,20 +706,20 @@ ST_FUNC void tcc_add_bcheck(TCCState *s1) pinit[11] = 0x89; pinit[12] = 0xc7; #endif - put_elf_reloc(symtab_section, init_section, + put_elf_reloc(sym_sec, init_section, init_section->data_offset - 11, R_X86_64_64, bsym_index); - sym_index = set_elf_sym(symtab_section, 0, 0, + sym_index = set_elf_sym(sym_sec, 0, 0, ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, SHN_UNDEF, "__bounds_add_static_var"); pinit = section_ptr_add(init_section, 5); pinit[0] = 0xe8; write32le(pinit + 1, -4); - put_elf_reloc(symtab_section, init_section, + put_elf_reloc(sym_sec, init_section, init_section->data_offset - 4, R_386_PC32, sym_index); /* R_386_PC32 = R_X86_64_PC32 = 2 */ #ifdef TCC_TARGET_PE { - int init_index = set_elf_sym(symtab_section, + int init_index = set_elf_sym(sym_sec, 0, 0, ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, init_section->sh_num, "__init_start");