x86: detect unsupported relocation types
Currently we support only relocations of type ELF64_R_TYPE or ELF32_R_TYPE. We should be warned if other relocation types appear in the relocation sections. This type of message has helped to identify code overwriting a relocation section before relocation and incorrect parsing of relocation tables. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
		
							parent
							
								
									194924d881
								
							
						
					
					
						commit
						80df194f01
					
				|  | @ -53,6 +53,15 @@ static void do_elf_reloc_fixups64(unsigned int text_base, uintptr_t size, | ||||||
| 	Elf64_Addr *offset_ptr_ram; | 	Elf64_Addr *offset_ptr_ram; | ||||||
| 
 | 
 | ||||||
| 	do { | 	do { | ||||||
|  | 		unsigned long long type = ELF64_R_TYPE(re_src->r_info); | ||||||
|  | 
 | ||||||
|  | 		if (type != R_X86_64_RELATIVE) { | ||||||
|  | 			printf("%s: unsupported relocation type 0x%llx " | ||||||
|  | 			       "at %p, ", __func__, type, re_src); | ||||||
|  | 			printf("offset = 0x%llx\n", re_src->r_offset); | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		/* Get the location from the relocation entry */ | 		/* Get the location from the relocation entry */ | ||||||
| 		offset_ptr_rom = (Elf64_Addr *)(uintptr_t)re_src->r_offset; | 		offset_ptr_rom = (Elf64_Addr *)(uintptr_t)re_src->r_offset; | ||||||
| 
 | 
 | ||||||
|  | @ -91,6 +100,15 @@ static void do_elf_reloc_fixups32(unsigned int text_base, uintptr_t size, | ||||||
| 	Elf32_Addr *offset_ptr_ram; | 	Elf32_Addr *offset_ptr_ram; | ||||||
| 
 | 
 | ||||||
| 	do { | 	do { | ||||||
|  | 		unsigned int type = ELF32_R_TYPE(re_src->r_info); | ||||||
|  | 
 | ||||||
|  | 		if (type != R_386_RELATIVE) { | ||||||
|  | 			printf("%s: unsupported relocation type 0x%x " | ||||||
|  | 			       "at %p, ", __func__, type, re_src); | ||||||
|  | 			printf("offset = 0x%x\n", re_src->r_offset); | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		/* Get the location from the relocation entry */ | 		/* Get the location from the relocation entry */ | ||||||
| 		offset_ptr_rom = (Elf32_Addr *)(uintptr_t)re_src->r_offset; | 		offset_ptr_rom = (Elf32_Addr *)(uintptr_t)re_src->r_offset; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue