summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2013-08-06 15:46:09 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2013-08-06 21:24:38 +0200
commit8b13d2f5f100d088746a1f8dd94f8ab82acc9b5b (patch)
treea9308e2e5ff87a637b467cc95b839a616c178785
parent48ccea96f25318b951607f192d1bfbe76b12eadf (diff)
downloadrockbox-8b13d2f5f100d088746a1f8dd94f8ab82acc9b5b.tar.gz
rockbox-8b13d2f5f100d088746a1f8dd94f8ab82acc9b5b.zip
elf: fix handling of virtual/physical addresses
Remove the hackish elf_translate_addresses which should not have existed in the first place, on write always compute the physical address of a section using elf_translate_virtual_address which makes it possible to specify any virtual to physical mapping and fail nicely if there is none. Change-Id: I4f436945e90280a6fd9430de6c642dbeb8e23d40
-rw-r--r--utils/imxtools/sbtools/elf.c15
-rw-r--r--utils/imxtools/sbtools/elf.h1
-rw-r--r--utils/imxtools/sbtools/elftosb.c1
-rw-r--r--utils/imxtools/sbtools/elftosb1.c2
4 files changed, 3 insertions, 16 deletions
diff --git a/utils/imxtools/sbtools/elf.c b/utils/imxtools/sbtools/elf.c
index adf876e5c7..5017251da3 100644
--- a/utils/imxtools/sbtools/elf.c
+++ b/utils/imxtools/sbtools/elf.c
@@ -519,8 +519,8 @@ void elf_write_file(struct elf_params_t *params, elf_write_fn_t write,
519 phdr.p_offset = sec->offset; 519 phdr.p_offset = sec->offset;
520 else 520 else
521 phdr.p_offset = 0; 521 phdr.p_offset = 0;
522 phdr.p_paddr = sec->addr; 522 phdr.p_paddr = elf_translate_virtual_address(params, sec->addr);
523 phdr.p_vaddr = phdr.p_paddr; /* assume identity map ? */ 523 phdr.p_vaddr = sec->addr; /* assume identity map ? */
524 phdr.p_memsz = sec->size; 524 phdr.p_memsz = sec->size;
525 if(sec->type == EST_LOAD) 525 if(sec->type == EST_LOAD)
526 phdr.p_filesz = phdr.p_memsz; 526 phdr.p_filesz = phdr.p_memsz;
@@ -795,17 +795,6 @@ uint32_t elf_translate_virtual_address(struct elf_params_t *params, uint32_t add
795 return addr; 795 return addr;
796} 796}
797 797
798void elf_translate_addresses(struct elf_params_t *params)
799{
800 struct elf_section_t *sec = params->first_section;
801 while(sec)
802 {
803 sec->addr = elf_translate_virtual_address(params, sec->addr);
804 sec = sec->next;
805 }
806 params->start_addr = elf_translate_virtual_address(params, params->start_addr);
807}
808
809bool elf_is_empty(struct elf_params_t *params) 798bool elf_is_empty(struct elf_params_t *params)
810{ 799{
811 return params->first_section == NULL; 800 return params->first_section == NULL;
diff --git a/utils/imxtools/sbtools/elf.h b/utils/imxtools/sbtools/elf.h
index 09cbe251a1..4200850e74 100644
--- a/utils/imxtools/sbtools/elf.h
+++ b/utils/imxtools/sbtools/elf.h
@@ -101,7 +101,6 @@ void elf_add_load_section(struct elf_params_t *params,
101void elf_add_fill_section(struct elf_params_t *params, 101void elf_add_fill_section(struct elf_params_t *params,
102 uint32_t fill_addr, uint32_t size, uint32_t pattern, const char *name); 102 uint32_t fill_addr, uint32_t size, uint32_t pattern, const char *name);
103uint32_t elf_translate_virtual_address(struct elf_params_t *params, uint32_t addr); 103uint32_t elf_translate_virtual_address(struct elf_params_t *params, uint32_t addr);
104void elf_translate_addresses(struct elf_params_t *params);
105void elf_simplify(struct elf_params_t *params); 104void elf_simplify(struct elf_params_t *params);
106void elf_sort_by_address(struct elf_params_t *params); 105void elf_sort_by_address(struct elf_params_t *params);
107void elf_write_file(struct elf_params_t *params, elf_write_fn_t write, elf_printf_fn_t printf, void *user); 106void elf_write_file(struct elf_params_t *params, elf_write_fn_t write, elf_printf_fn_t printf, void *user);
diff --git a/utils/imxtools/sbtools/elftosb.c b/utils/imxtools/sbtools/elftosb.c
index a18bad6437..e264337d11 100644
--- a/utils/imxtools/sbtools/elftosb.c
+++ b/utils/imxtools/sbtools/elftosb.c
@@ -88,7 +88,6 @@ static void load_elf_by_id(struct cmd_file_t *cmd_file, const char *id)
88 fclose(fd); 88 fclose(fd);
89 if(!src->loaded) 89 if(!src->loaded)
90 bug("error loading elf file '%s' (id '%s')\n", src->filename, id); 90 bug("error loading elf file '%s' (id '%s')\n", src->filename, id);
91 elf_translate_addresses(&src->elf);
92} 91}
93 92
94static void load_bin_by_id(struct cmd_file_t *cmd_file, const char *id) 93static void load_bin_by_id(struct cmd_file_t *cmd_file, const char *id)
diff --git a/utils/imxtools/sbtools/elftosb1.c b/utils/imxtools/sbtools/elftosb1.c
index 79b7621844..43f9b1e9be 100644
--- a/utils/imxtools/sbtools/elftosb1.c
+++ b/utils/imxtools/sbtools/elftosb1.c
@@ -19,6 +19,7 @@
19 * 19 *
20 ****************************************************************************/ 20 ****************************************************************************/
21 21
22#define _POSIX_C_SOURCE 200809L /* for strdup */
22#include <stdio.h> 23#include <stdio.h>
23#include <errno.h> 24#include <errno.h>
24#include <stdlib.h> 25#include <stdlib.h>
@@ -405,7 +406,6 @@ static int load_elf(struct sb1_file_t *sb, const char *filename, int act)
405 fclose(fd); 406 fclose(fd);
406 if(!loaded) 407 if(!loaded)
407 bug("error loading elf file '%s'\n", filename); 408 bug("error loading elf file '%s'\n", filename);
408 elf_translate_addresses(&elf);
409 elf_sort_by_address(&elf); 409 elf_sort_by_address(&elf);
410 410
411 struct elf_section_t *esec = elf.first_section; 411 struct elf_section_t *esec = elf.first_section;