summaryrefslogtreecommitdiff
path: root/patches/0003-ld-Create-a-new-LOAD-segment-for-text-only-LOAD-segm.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/0003-ld-Create-a-new-LOAD-segment-for-text-only-LOAD-segm.patch')
-rw-r--r--patches/0003-ld-Create-a-new-LOAD-segment-for-text-only-LOAD-segm.patch161
1 files changed, 0 insertions, 161 deletions
diff --git a/patches/0003-ld-Create-a-new-LOAD-segment-for-text-only-LOAD-segm.patch b/patches/0003-ld-Create-a-new-LOAD-segment-for-text-only-LOAD-segm.patch
deleted file mode 100644
index 307e5d062a1..00000000000
--- a/patches/0003-ld-Create-a-new-LOAD-segment-for-text-only-LOAD-segm.patch
+++ /dev/null
@@ -1,161 +0,0 @@
-From cc2bcf62719bc5cf63105843ced20d0952667142 Mon Sep 17 00:00:00 2001
-From: "H.J. Lu" <hjl.tools@gmail.com>
-Date: Sun, 12 Nov 2017 11:34:03 -0800
-Subject: [PATCH 3/6] ld: Create a new LOAD segment for text-only LOAD segment
-
-When there is a text-only LOAD segment, create a new LOAD segment if the
-previous section contains text and the current section doesn't or vice
-versa:
-
-Elf file type is DYN (Shared object file)
-Entry point 0x200ff0
-There are 7 program headers, starting at offset 52
-
-Program Headers:
- Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
- LOAD 0x000000 0x00000000 0x00000000 0x00200 0x00200 R 0x200000
- LOAD 0x000fd0 0x00200fd0 0x00200fd0 0x0002b 0x0002b R E 0x200000
- LOAD 0x001000 0x00201000 0x00201000 0x00058 0x00058 R 0x200000
- LOAD 0x200f80 0x00400f80 0x00400f80 0x000a0 0x000a0 RW 0x200000
- DYNAMIC 0x200f80 0x00400f80 0x00400f80 0x00080 0x00080 RW 0x4
- GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10
- GNU_RELRO 0x200f80 0x00400f80 0x00400f80 0x00080 0x00080 R 0x1
-
- Section to Segment mapping:
- Segment Sections...
- 00 .hash .gnu.hash .dynsym .dynstr .rela.plt
- 01 .plt .text
- 02 .rodata .eh_frame
- 03 .dynamic .got.plt
- 04 .dynamic
- 05
- 06 .dynamic
-
-This is to prevent executing data in read-only sections as instructions.
-
-Also don't put a writable section in a read-only segment if there is a
-RELRO segment.
-
-Since there are more than 2 LOAD segments, the minimum file size is
-bigger than the maximum page size which is 2MB (0x200000):
-
--rwxr-xr-x 1 hjl hjl 2104892 Nov 12 11:53 libfoo.so
-
-"-z max-page-size=0x1000" can be used to reduce the maximum page size to
-4KB (0x1000):
-
--rwxr-xr-x 1 hjl hjl 11836 Nov 12 13:22 libfoo.so
-
-Elf file type is DYN (Shared object file)
-Entry point 0x1ff0
-There are 7 program headers, starting at offset 52
-
-Program Headers:
- Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
- LOAD 0x000000 0x00000000 0x00000000 0x00200 0x00200 R 0x1000
- LOAD 0x000fd0 0x00001fd0 0x00001fd0 0x0002b 0x0002b R E 0x1000
- LOAD 0x001000 0x00002000 0x00002000 0x00058 0x00058 R 0x1000
- LOAD 0x001f80 0x00002f80 0x00002f80 0x000a0 0x000a0 RW 0x1000
- DYNAMIC 0x001f80 0x00002f80 0x00002f80 0x00080 0x00080 RW 0x4
- GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10
- GNU_RELRO 0x001f80 0x00002f80 0x00002f80 0x00080 0x00080 R 0x1
-
- Section to Segment mapping:
- Segment Sections...
- 00 .hash .gnu.hash .dynsym .dynstr .rela.plt
- 01 .plt .text
- 02 .rodata .eh_frame
- 03 .dynamic .got.plt
- 04 .dynamic
- 05
- 06 .dynamic
-
- PR ld/22393
- * elf.c (_bfd_elf_map_sections_to_segments): When there is a
- text-only LOAD segment, create a new LOAD segment if the
- previous section contains text and the current section doesn't
- or vice versa. Don't put a writable section in a read-only
- segment if there is a RELRO segment.
----
- bfd/elf.c | 32 +++++++++++++++++++++++++-------
- 1 file changed, 25 insertions(+), 7 deletions(-)
-
-diff --git a/bfd/elf.c b/bfd/elf.c
-index 694e43540f..9c5de9675c 100644
---- a/bfd/elf.c
-+++ b/bfd/elf.c
-@@ -4555,6 +4555,7 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
- asection **hdrpp;
- bfd_boolean phdr_in_segment = TRUE;
- bfd_boolean writable;
-+ bfd_boolean executable;
- int tls_count = 0;
- asection *first_tls = NULL;
- asection *first_mbind = NULL;
-@@ -4643,6 +4644,7 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
- if (maxpagesize == 0)
- maxpagesize = 1;
- writable = FALSE;
-+ executable = FALSE;
- dynsec = bfd_get_section_by_name (abfd, ".dynamic");
- if (dynsec != NULL
- && (dynsec->flags & SEC_LOAD) == 0)
-@@ -4745,18 +4747,27 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
- file, then there is no other reason for a new segment. */
- new_segment = FALSE;
- }
-+ else if (info != NULL
-+ && info->text_end > info->text_start
-+ && executable != ((hdr->flags & SEC_CODE) != 0))
-+ {
-+ new_segment = TRUE;
-+ }
- else if (! writable
- && (hdr->flags & SEC_READONLY) == 0
-- && (((last_hdr->lma + last_size - 1) & -maxpagesize)
-- != (hdr->lma & -maxpagesize)))
-+ && ((info != NULL
-+ && info->relro_end > info->relro_start)
-+ || (((last_hdr->lma + last_size - 1) & -maxpagesize)
-+ != (hdr->lma & -maxpagesize))))
- {
- /* We don't want to put a writable section in a read only
- segment, unless they are on the same page in memory
-- anyhow. We already know that the last section does not
-- bring us past the current section on the page, so the
-- only case in which the new section is not on the same
-- page as the previous section is when the previous section
-- ends precisely on a page boundary. */
-+ anyhow and there is no RELRO segment. We already
-+ know that the last section does not bring us past the
-+ current section on the page, so the only case in which
-+ the new section is not on the same page as the previous
-+ section is when the previous section ends precisely on
-+ a page boundary. */
- new_segment = TRUE;
- }
- else
-@@ -4778,6 +4789,8 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
- {
- if ((hdr->flags & SEC_READONLY) == 0)
- writable = TRUE;
-+ if ((hdr->flags & SEC_CODE) != 0)
-+ executable = TRUE;
- last_hdr = hdr;
- /* .tbss sections effectively have zero size. */
- if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
-@@ -4803,6 +4816,11 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
- else
- writable = FALSE;
-
-+ if ((hdr->flags & SEC_CODE) == 0)
-+ executable = FALSE;
-+ else
-+ executable = TRUE;
-+
- last_hdr = hdr;
- /* .tbss sections effectively have zero size. */
- if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) != SEC_THREAD_LOCAL)
---
-2.13.6
-