mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-04-01 03:51:31 +00:00
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
This commit is contained in:
commit
5d6fefa805
4 changed files with 40 additions and 30 deletions
|
@ -248,6 +248,24 @@ config MIPS_CACHE_INDEX_BASE
|
||||||
Normally this is CKSEG0. If the MIPS system needs to move this block
|
Normally this is CKSEG0. If the MIPS system needs to move this block
|
||||||
to some SRAM or ScratchPad RAM, adapt this option accordingly.
|
to some SRAM or ScratchPad RAM, adapt this option accordingly.
|
||||||
|
|
||||||
|
config MIPS_RELOCATION_TABLE_SIZE
|
||||||
|
hex "Relocation table size"
|
||||||
|
range 0x100 0x10000
|
||||||
|
default "0x8000"
|
||||||
|
---help---
|
||||||
|
A table of relocation data will be appended to the U-Boot binary
|
||||||
|
and parsed in relocate_code() to fix up all offsets in the relocated
|
||||||
|
U-Boot.
|
||||||
|
|
||||||
|
This option allows the amount of space reserved for the table to be
|
||||||
|
adjusted in a range from 256 up to 64k. The default is 32k and should
|
||||||
|
be ok in most cases. Reduce this value to shrink the size of U-Boot
|
||||||
|
binary.
|
||||||
|
|
||||||
|
The build will fail and a valid size suggested if this is too small.
|
||||||
|
|
||||||
|
If unsure, leave at the default value.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "OS boot interface"
|
menu "OS boot interface"
|
||||||
|
|
|
@ -55,7 +55,7 @@ PLATFORM_ELFFLAGS += -B mips $(OBJCOPYFLAGS)
|
||||||
# MODFLAGS += -mlong-calls
|
# MODFLAGS += -mlong-calls
|
||||||
#
|
#
|
||||||
ifndef CONFIG_SPL_BUILD
|
ifndef CONFIG_SPL_BUILD
|
||||||
OBJCOPYFLAGS += -j .got -j .rel -j .padding -j .dtb.init.rodata
|
OBJCOPYFLAGS += -j .data.reloc -j .dtb.init.rodata
|
||||||
LDFLAGS_FINAL += --emit-relocs
|
LDFLAGS_FINAL += --emit-relocs
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -41,16 +41,22 @@ SECTIONS
|
||||||
__image_copy_end = .;
|
__image_copy_end = .;
|
||||||
__init_end = .;
|
__init_end = .;
|
||||||
|
|
||||||
/*
|
.data.reloc : {
|
||||||
* .rel must come last so that the mips-relocs tool can shrink
|
|
||||||
* the section size & the PT_LOAD program header filesz.
|
|
||||||
*/
|
|
||||||
.rel : {
|
|
||||||
__rel_start = .;
|
__rel_start = .;
|
||||||
BYTE(0x0)
|
/*
|
||||||
. += (32 * 1024) - 1;
|
* Space for relocation table
|
||||||
|
* This needs to be filled so that the
|
||||||
|
* mips-reloc tool can overwrite the content.
|
||||||
|
* An invalid value is left at the start of the
|
||||||
|
* section to abort relocation if the table
|
||||||
|
* has not been filled in.
|
||||||
|
*/
|
||||||
|
LONG(0xFFFFFFFF);
|
||||||
|
FILL(0);
|
||||||
|
. += CONFIG_MIPS_RELOCATION_TABLE_SIZE - 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
_end = .;
|
_end = .;
|
||||||
|
|
||||||
.bss __rel_start (OVERLAY) : {
|
.bss __rel_start (OVERLAY) : {
|
||||||
|
|
|
@ -195,15 +195,13 @@ static int compare_relocs(const void *a, const void *b)
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
unsigned int i, j, i_rel_shdr, sh_type, sh_entsize, sh_entries;
|
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;
|
const char *shstrtab, *sh_name, *rel_pfx;
|
||||||
int (*parse_fn)(const void *rel);
|
int (*parse_fn)(const void *rel);
|
||||||
uint8_t *buf_start, *buf;
|
uint8_t *buf_start, *buf;
|
||||||
const Elf32_Ehdr *ehdr32;
|
const Elf32_Ehdr *ehdr32;
|
||||||
const Elf64_Ehdr *ehdr64;
|
const Elf64_Ehdr *ehdr64;
|
||||||
uintptr_t sh_offset;
|
uintptr_t sh_offset;
|
||||||
Elf32_Phdr *phdr32;
|
|
||||||
Elf64_Phdr *phdr64;
|
|
||||||
Elf32_Shdr *shdr32;
|
Elf32_Shdr *shdr32;
|
||||||
Elf64_Shdr *shdr64;
|
Elf64_Shdr *shdr64;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
@ -285,8 +283,6 @@ int main(int argc, char *argv[])
|
||||||
goto out_free_relocs;
|
goto out_free_relocs;
|
||||||
}
|
}
|
||||||
|
|
||||||
phdr32 = elf + ehdr_field(e_phoff);
|
|
||||||
phdr64 = elf + ehdr_field(e_phoff);
|
|
||||||
shdr32 = elf + ehdr_field(e_shoff);
|
shdr32 = elf + ehdr_field(e_shoff);
|
||||||
shdr64 = elf + ehdr_field(e_shoff);
|
shdr64 = elf + ehdr_field(e_shoff);
|
||||||
shstrtab = elf + shdr_field(ehdr_field(e_shstrndx), sh_offset);
|
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++) {
|
for (i = 0; i < ehdr_field(e_shnum); i++) {
|
||||||
sh_name = shstr(shdr_field(i, sh_name));
|
sh_name = shstr(shdr_field(i, sh_name));
|
||||||
|
|
||||||
if (!strcmp(sh_name, ".rel")) {
|
if (!strcmp(sh_name, ".data.reloc")) {
|
||||||
i_rel_shdr = i;
|
i_rel_shdr = i;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -397,22 +393,12 @@ int main(int argc, char *argv[])
|
||||||
rel_size = shdr_field(i_rel_shdr, sh_size);
|
rel_size = shdr_field(i_rel_shdr, sh_size);
|
||||||
rel_actual_size = buf - buf_start;
|
rel_actual_size = buf - buf_start;
|
||||||
if (rel_actual_size > rel_size) {
|
if (rel_actual_size > rel_size) {
|
||||||
fprintf(stderr, "Relocs overflowed .rel section\n");
|
fprintf(stderr, "Relocations overflow available space of 0x%lx (required 0x%lx)!\n",
|
||||||
return -ENOMEM;
|
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);
|
||||||
/* Update the .rel section's size */
|
err = -ENOMEM;
|
||||||
set_shdr_field(i_rel_shdr, sh_size, rel_actual_size);
|
goto out_free_relocs;
|
||||||
|
|
||||||
/* 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure data is written back to the file */
|
/* Make sure data is written back to the file */
|
||||||
|
|
Loading…
Add table
Reference in a new issue