diff options
author | Tom Rini <trini@konsulko.com> | 2018-11-03 08:21:05 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2018-11-03 08:21:05 -0400 |
commit | 5d6fefa8051a29b26169983cbcf9378bb363f8b2 (patch) | |
tree | 02698bdef9005f995c36d87353c3f172e082836c /tools | |
parent | 99431c1c21685fe63d46b6eac995b78ce9adce0a (diff) | |
parent | 963014641117291c15df2425caf46c7b4b979f18 (diff) |
Merge tag 'mips-fixes-for-v2018.11' of git://git.denx.de/u-boot-mips
- replace the dynamic size of the relocation table
with a fixed but configurable size
- fixes non-working CONFIG_OF_SEPARATE=y due to invalid _end symbol
Diffstat (limited to 'tools')
-rw-r--r-- | tools/mips-relocs.c | 30 |
1 files changed, 8 insertions, 22 deletions
diff --git a/tools/mips-relocs.c b/tools/mips-relocs.c index 442cc8f6d2..625258085b 100644 --- a/tools/mips-relocs.c +++ b/tools/mips-relocs.c @@ -195,15 +195,13 @@ static int compare_relocs(const void *a, const void *b) int main(int argc, char *argv[]) { unsigned int i, j, i_rel_shdr, sh_type, sh_entsize, sh_entries; - size_t rel_size, rel_actual_size, load_sz; + size_t rel_size, rel_actual_size; const char *shstrtab, *sh_name, *rel_pfx; int (*parse_fn)(const void *rel); uint8_t *buf_start, *buf; const Elf32_Ehdr *ehdr32; const Elf64_Ehdr *ehdr64; uintptr_t sh_offset; - Elf32_Phdr *phdr32; - Elf64_Phdr *phdr64; Elf32_Shdr *shdr32; Elf64_Shdr *shdr64; struct stat st; @@ -285,8 +283,6 @@ int main(int argc, char *argv[]) goto out_free_relocs; } - phdr32 = elf + ehdr_field(e_phoff); - phdr64 = elf + ehdr_field(e_phoff); shdr32 = elf + ehdr_field(e_shoff); shdr64 = elf + ehdr_field(e_shoff); shstrtab = elf + shdr_field(ehdr_field(e_shstrndx), sh_offset); @@ -295,7 +291,7 @@ int main(int argc, char *argv[]) for (i = 0; i < ehdr_field(e_shnum); i++) { sh_name = shstr(shdr_field(i, sh_name)); - if (!strcmp(sh_name, ".rel")) { + if (!strcmp(sh_name, ".data.reloc")) { i_rel_shdr = i; continue; } @@ -397,22 +393,12 @@ int main(int argc, char *argv[]) rel_size = shdr_field(i_rel_shdr, sh_size); rel_actual_size = buf - buf_start; if (rel_actual_size > rel_size) { - fprintf(stderr, "Relocs overflowed .rel section\n"); - return -ENOMEM; - } - - /* Update the .rel section's size */ - set_shdr_field(i_rel_shdr, sh_size, rel_actual_size); - - /* Shrink the PT_LOAD program header filesz (ie. shrink u-boot.bin) */ - for (i = 0; i < ehdr_field(e_phnum); i++) { - if (phdr_field(i, p_type) != PT_LOAD) - continue; - - load_sz = phdr_field(i, p_filesz); - load_sz -= rel_size - rel_actual_size; - set_phdr_field(i, p_filesz, load_sz); - break; + fprintf(stderr, "Relocations overflow available space of 0x%lx (required 0x%lx)!\n", + rel_size, rel_actual_size); + fprintf(stderr, "Please adjust CONFIG_MIPS_RELOCATION_TABLE_SIZE to at least 0x%lx\n", + (rel_actual_size + 0x100) & ~0xFF); + err = -ENOMEM; + goto out_free_relocs; } /* Make sure data is written back to the file */ |