From e22249b81c367afc43bbc8029e700964c21900ce Mon Sep 17 00:00:00 2001 From: Thomas Preud'homme Date: Mon, 5 Dec 2016 20:58:00 +0000 Subject: [PATCH] Error on unrecognized relocations --- tcc.h | 3 ++- tccelf.c | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tcc.h b/tcc.h index 65858d0..34cde73 100644 --- a/tcc.h +++ b/tcc.h @@ -1323,13 +1323,14 @@ enum gotplt_entry { /* what kind of relocation is it */ struct reloc_info { + int known; /* true for known relocation */ int code_reloc; /* if false, that's a data reloc */ int gotplt_entry; /* wether and when to create a GOT/PLT entry */ int pltoff_addend; /* wether to store the PLT offset in addend */ }; #define INIT_RELOC_INFO(rtype, code_reloc, gotplt_entry, pltoff_addend) \ - [rtype] = {code_reloc, gotplt_entry, pltoff_addend}, + [rtype] = {1, code_reloc, gotplt_entry, pltoff_addend}, ST_DATA struct reloc_info relocs_info[R_NUM]; ST_DATA Section *text_section, *data_section, *bss_section; /* predefined sections */ diff --git a/tccelf.c b/tccelf.c index 7d656e5..7f1679d 100644 --- a/tccelf.c +++ b/tccelf.c @@ -1042,6 +1042,10 @@ ST_FUNC void build_got_entries(TCCState *s1) type = ELFW(R_TYPE)(rel->r_info); sym_index = ELFW(R_SYM)(rel->r_info); sym = &((ElfW(Sym) *)symtab_section->data)[sym_index]; + + if (type >= R_NUM || !relocs_info[type].known) + tcc_error("Unknown relocation: %d\n", type); + if (relocs_info[type].gotplt_entry == NO_GOTPLT_ENTRY) continue;