From 8b7fdb1dedfb8a6e858b46e5af33029fe0462ab8 Mon Sep 17 00:00:00 2001 From: Damien Le Moal Date: Tue, 10 May 2022 23:14:36 +0900 Subject: [PATCH] elf2flt: fix .eh_frame section handling elf2flt.ld linker script positions the .eh_frame section in an output section after the .text and .data output sections. However, when elf2flt.c is supplied the ELF linked using the elf2flt.ld linker script, it only looks at the flags for each input section, and then puts it in either a bFLT text, data or bss output section. Commit ba379d08bb7 ("elf2flt: fix for segfault on some ARM ELFs") modified the section scanning loop of elf2flt main() function to put read-only relocation data sections in the bFLT text output section so that the .ARM.exidx section is placed in the .text flat output section. Previously a read-only relocation data section would be put in the data output section. On ARM, the .eh_frame section does not have the SEC_RELOC flag set, so it will still end up in the data output section. However, on architectures that generates the .eh_frame section with the SEC_RELOC flag set, this section will now be placed in the text output section. The logic in elf2flt will handle all sections in order, and since the input order is .text, .data, and .eh_frame, putting .eh_frame in text output section does not work, since elf2flt.c has already put the .data input section in the bFLT data output section. This leads to the following print (example for riscv64 architecture): buildroot/output/host/riscv64-buildroot-linux-uclibc/bin/elf2flt: ERROR: text=0x3bab8 overlaps data=0x33f60 ? The way that elf2flt is written, we cannot append to the text output section after an input section has been added to the data output section. It might be possible to change this, but that would require moving all the code the was already placed in the data output section. Instead, let's allow putting a read-only relocation data section in the text output section (so that .ARM.exidx will still be placed correctly), but only if there has not yet been anything placed in the data output section. That way .ARM.exidx will still be placed correctly, and .eh_frame will be placed correctly in the .data output section, regardless if it has flag SEC_RELOC set or not. Fixes: ba379d08bb7 ("elf2flt: fix for segfault on some ARM ELFs") Signed-off-by: Damien Le Moal Signed-off-by: Niklas Cassel --- elf2flt.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/elf2flt.c b/elf2flt.c index 7ac0617..da25e93 100644 --- a/elf2flt.c +++ b/elf2flt.c @@ -1877,8 +1877,9 @@ int main(int argc, char *argv[]) bfd_vma sec_vma; if ((s->flags & SEC_CODE) || - ((s->flags & (SEC_DATA | SEC_READONLY | SEC_RELOC)) == - (SEC_DATA | SEC_READONLY | SEC_RELOC))) { + (((s->flags & (SEC_DATA | SEC_READONLY | SEC_RELOC)) == + (SEC_DATA | SEC_READONLY | SEC_RELOC)) && + !data_len)) { vma = &text_vma; len = &text_len; } else if (s->flags & SEC_DATA) { -- 2.35.1