ldelf: scripts/gen_ldelf_hex.py: allow multiple RW load segments
Allow multiple read/write load segments as long as they are contiguous.
This is to support Clang > 8.0.0 which generates this:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x001000 0x00000000 0x00000000 0x0a50c 0x0a50c R E 0x1000
LOAD 0x00c000 0x0000b000 0x0000b000 0x0006c 0x0006c RW 0x1000
LOAD 0x00c06c 0x0000b06c 0x0000b06c 0x0006c 0x0007c RW 0x1000
DYNAMIC 0x00c000 0x0000b000 0x0000b000 0x00060 0x00060 RW 0x4
GNU_RELRO 0x00c000 0x0000b000 0x0000b000 0x0006c 0x01000 R 0x1
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0
EXIDX 0x00b134 0x0000a134 0x0000a134 0x00258 0x00258 R 0x4
Section to Segment mapping:
Segment Sections...
00 .text .rodata .ARM.exidx .gnu.hash .ARM.extab .dynsym .dynstr .hash .rel.dyn
01 .dynamic .got
02 .data .bss
03 .dynamic
04 .dynamic .got .bss
05
06 .ARM.exidx
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Acked-by: Jens Wiklander <jens.wiklander@linaro.org>
diff --git a/scripts/gen_ldelf_hex.py b/scripts/gen_ldelf_hex.py
index c3969e3..2a8c22a 100755
--- a/scripts/gen_ldelf_hex.py
+++ b/scripts/gen_ldelf_hex.py
@@ -26,6 +26,8 @@
def emit_load_segments(elffile, outf):
load_size = 0
+ data_size = 0
+ next_rwseg_va = 0
n = 0
for segment in elffile.iter_segments():
if segment['p_type'] == 'PT_LOAD':
@@ -34,14 +36,17 @@
print('Expected first load segment to be read/execute')
sys.exit(1)
code_size = segment['p_filesz']
- if n == 1:
+ else:
if segment['p_flags'] != (P_FLAGS.PF_R | P_FLAGS.PF_W):
- print('Expected second load segment to be read/write')
+ print('Expected load segment to be read/write')
sys.exit(1)
- data_size = segment['p_filesz']
- if n > 1:
- print('Only expected two load segments')
- sys.exit(1)
+ if next_rwseg_va and segment['p_vaddr'] != next_rwseg_va:
+ print('Expected contiguous read/write segments')
+ print(segment['p_vaddr'])
+ print(next_rwseg_va)
+ sys.exit(1)
+ data_size += segment['p_filesz']
+ next_rwseg_va = segment['p_vaddr'] + segment['p_filesz']
load_size += segment['p_filesz']
n = n + 1