tools: relocate-rela: add support for handling 32-bit big endian files
Currently, a microblaze build with CONFIG_SYS_BIG_ENDIAN=y and CONFIG_STATIC_RELA=y fails with: tools/relocate-rela: Not supported machine type ELF decoding failed make[2]: *** [u-boot/Makefile:1306: u-boot-nodtb.bin] Error 1 To fix this, convert the 32-bit codepath to use the previously added elf{16,32}_to_cpu() functions. The aarch64 codepath is left untouched. This commit ensures that CI doesn't fail for the next patches which enable runtime relocation by default for microblaze. Reviewed-by: Michal Simek <michal.simek@amd.com> Signed-off-by: Ovidiu Panait <ovpanait@gmail.com> Link: https://lore.kernel.org/r/20230311173838.521804-3-ovpanait@gmail.com Signed-off-by: Michal Simek <michal.simek@amd.com>
This commit is contained in:
parent
424f04fcd9
commit
02d30e5f92
1 changed files with 16 additions and 16 deletions
|
@ -251,7 +251,7 @@ static int decode_elf32(FILE *felf, char **argv)
|
||||||
return 25;
|
return 25;
|
||||||
}
|
}
|
||||||
|
|
||||||
machine = le16_to_cpu(header.e_machine);
|
machine = elf16_to_cpu(header.e_machine);
|
||||||
debug("Machine %d\n", machine);
|
debug("Machine %d\n", machine);
|
||||||
|
|
||||||
if (machine != EM_MICROBLAZE) {
|
if (machine != EM_MICROBLAZE) {
|
||||||
|
@ -259,10 +259,10 @@ static int decode_elf32(FILE *felf, char **argv)
|
||||||
return 30;
|
return 30;
|
||||||
}
|
}
|
||||||
|
|
||||||
text_base = le32_to_cpu(header.e_entry);
|
text_base = elf32_to_cpu(header.e_entry);
|
||||||
section_header_base = le32_to_cpu(header.e_shoff);
|
section_header_base = elf32_to_cpu(header.e_shoff);
|
||||||
section_header_size = le16_to_cpu(header.e_shentsize) *
|
section_header_size = elf16_to_cpu(header.e_shentsize) *
|
||||||
le16_to_cpu(header.e_shnum);
|
elf16_to_cpu(header.e_shnum);
|
||||||
|
|
||||||
sh_table = malloc(section_header_size);
|
sh_table = malloc(section_header_size);
|
||||||
if (!sh_table) {
|
if (!sh_table) {
|
||||||
|
@ -290,8 +290,8 @@ static int decode_elf32(FILE *felf, char **argv)
|
||||||
return 27;
|
return 27;
|
||||||
}
|
}
|
||||||
|
|
||||||
sh_index = le16_to_cpu(header.e_shstrndx);
|
sh_index = elf16_to_cpu(header.e_shstrndx);
|
||||||
sh_size = le32_to_cpu(sh_table[sh_index].sh_size);
|
sh_size = elf32_to_cpu(sh_table[sh_index].sh_size);
|
||||||
debug("e_shstrndx %x, sh_size %lx\n", sh_index, sh_size);
|
debug("e_shstrndx %x, sh_size %lx\n", sh_index, sh_size);
|
||||||
|
|
||||||
sh_str = malloc(sh_size);
|
sh_str = malloc(sh_size);
|
||||||
|
@ -306,8 +306,8 @@ static int decode_elf32(FILE *felf, char **argv)
|
||||||
* Specifies the byte offset from the beginning of the file
|
* Specifies the byte offset from the beginning of the file
|
||||||
* to the first byte in the section.
|
* to the first byte in the section.
|
||||||
*/
|
*/
|
||||||
sh_offset = le32_to_cpu(sh_table[sh_index].sh_offset);
|
sh_offset = elf32_to_cpu(sh_table[sh_index].sh_offset);
|
||||||
sh_num = le16_to_cpu(header.e_shnum);
|
sh_num = elf16_to_cpu(header.e_shnum);
|
||||||
|
|
||||||
ret = fseek(felf, sh_offset, SEEK_SET);
|
ret = fseek(felf, sh_offset, SEEK_SET);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -329,13 +329,13 @@ static int decode_elf32(FILE *felf, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < sh_num; i++) {
|
for (i = 0; i < sh_num; i++) {
|
||||||
char *sh_name = sh_str + le32_to_cpu(sh_table[i].sh_name);
|
char *sh_name = sh_str + elf32_to_cpu(sh_table[i].sh_name);
|
||||||
|
|
||||||
debug("%s\n", sh_name);
|
debug("%s\n", sh_name);
|
||||||
|
|
||||||
sh_addr = le32_to_cpu(sh_table[i].sh_addr);
|
sh_addr = elf32_to_cpu(sh_table[i].sh_addr);
|
||||||
sh_offset = le32_to_cpu(sh_table[i].sh_offset);
|
sh_offset = elf32_to_cpu(sh_table[i].sh_offset);
|
||||||
sh_size = le32_to_cpu(sh_table[i].sh_size);
|
sh_size = elf32_to_cpu(sh_table[i].sh_size);
|
||||||
|
|
||||||
if (!strcmp(".rela.dyn", sh_name)) {
|
if (!strcmp(".rela.dyn", sh_name)) {
|
||||||
debug("Found section\t\".rela_dyn\"\n");
|
debug("Found section\t\".rela_dyn\"\n");
|
||||||
|
@ -540,9 +540,9 @@ static int rela_elf32(char **argv, FILE *f)
|
||||||
PRIu32 " r_addend:\t%" PRIx32 "\n",
|
PRIu32 " r_addend:\t%" PRIx32 "\n",
|
||||||
rela.r_offset, rela.r_info, rela.r_addend);
|
rela.r_offset, rela.r_info, rela.r_addend);
|
||||||
|
|
||||||
swrela.r_offset = le32_to_cpu(rela.r_offset);
|
swrela.r_offset = elf32_to_cpu(rela.r_offset);
|
||||||
swrela.r_info = le32_to_cpu(rela.r_info);
|
swrela.r_info = elf32_to_cpu(rela.r_info);
|
||||||
swrela.r_addend = le32_to_cpu(rela.r_addend);
|
swrela.r_addend = elf32_to_cpu(rela.r_addend);
|
||||||
|
|
||||||
debug("SWRela:\toffset:\t%" PRIx32 " r_info:\t%"
|
debug("SWRela:\toffset:\t%" PRIx32 " r_info:\t%"
|
||||||
PRIu32 " r_addend:\t%" PRIx32 "\n",
|
PRIu32 " r_addend:\t%" PRIx32 "\n",
|
||||||
|
|
Loading…
Reference in a new issue