]> git.wh0rd.org Git - elf2flt.git/commitdiff
elf2flt: fix relocations for read-only data
authorGreg Ungerer <gerg@kernel.org>
Wed, 30 Oct 2019 06:08:19 +0000 (16:08 +1000)
committerGreg Ungerer <gerg@kernel.org>
Wed, 30 Oct 2019 06:08:19 +0000 (16:08 +1000)
Readonly data sections are mapped into the "text" section in the
elf2flt.ld linker script. The relocation generation code is not handling
that case properly though, and is actually mapping any data section type
into the "data" section of the target binary.

This problem case has been detected with elf2flt core dumping when used
with binutils-2.33.1 (on ARM architecture targets). See thread at:

  https://sourceware.org/ml/binutils/2019-10/msg00132.html

Signed-off-by: Greg Ungerer <gerg@kernel.org>
elf2flt.c

index 67f720a56b36f3f8857bd5894c3d6549f64bc9aa..8973cef179feb3c230d0d1b0f861d14f307c1ae1 100644 (file)
--- a/elf2flt.c
+++ b/elf2flt.c
@@ -418,10 +418,12 @@ output_relocs (
 //             continue;
 
        /*
-        *      Only relocate things in the data sections if we are PIC/GOT.
-        *      otherwise do text as well
+        * Only relocate things in the writable data sections if we are PIC/GOT.
+        * Otherwise do text (and read only data) as well.
         */
-       if ((!pic_with_got || ALWAYS_RELOC_TEXT) && (a->flags & SEC_CODE))
+       if ((!pic_with_got || ALWAYS_RELOC_TEXT) &&
+           ((a->flags & SEC_CODE) ||
+           ((a->flags & (SEC_DATA | SEC_READONLY)) == (SEC_DATA | SEC_READONLY))))
                sectionp = text + (a->vma - text_vma);
        else if (a->flags & SEC_DATA)
                sectionp = data + (a->vma - data_vma);