[hjl@gnu-6 relro-6]$ cat x.c extern void f1 (void); #if 1 void * const p1 __attribute__ ((aligned(32))) = &f1; #else void * const p1 = &f1; #endif [hjl@gnu-6 relro-6]$ make libx.so LD=ld gcc -fuse-ld=gold -B./ -O2 -fPIC -c -o x.o x.c ld -shared --gc-sections -z relro -o libx.so x.o [hjl@gnu-6 relro-6]$ readelf -SWl libx.so There are 12 section headers, starting at offset 0x1078: Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 [ 1] .hash HASH 0000000000000120 000120 000030 04 A 2 0 8 [ 2] .dynsym DYNSYM 0000000000000150 000150 0000a8 18 A 3 2 8 [ 3] .dynstr STRTAB 00000000000001f8 0001f8 00001f 00 A 0 0 1 [ 4] .rela.dyn RELA 0000000000000218 000218 000018 18 A 2 0 8 [ 5] .eh_frame PROGBITS 0000000000000230 000230 000000 00 A 0 0 8 [ 6] .data.rel.ro PROGBITS 0000000000200f00 000f00 000008 00 WA 0 0 32 [ 7] .dynamic DYNAMIC 0000000000200f08 000f08 0000e0 10 WA 3 0 8 [ 8] .comment PROGBITS 0000000000000000 000fe8 00002c 01 MS 0 0 1 [ 9] .shstrtab STRTAB 0000000000000000 001014 000064 00 0 0 1 [10] .symtab SYMTAB 0000000000000000 001378 0001b0 18 11 16 8 [11] .strtab STRTAB 0000000000000000 001528 000042 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) Elf file type is DYN (Shared object file) Entry point 0x0 There are 4 program headers, starting at offset 64 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x000230 0x000230 R 0x200000 LOAD 0x000f00 0x0000000000200f00 0x0000000000200f00 0x0000e8 0x0000e8 RW 0x200000 DYNAMIC 0x000f08 0x0000000000200f08 0x0000000000200f08 0x0000e0 0x0000e0 RW 0x8 GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x10 Section to Segment mapping: Segment Sections... 00 .hash .dynsym .dynstr .rela.dyn 01 .data.rel.ro .dynamic 02 .dynamic 03 [hjl@gnu-6 relro-6]$
That is invalid since ld can't align .data.rel.ro section to 32-byte and make p_vaddr + ->p_filesz for RELO segment on page boundary without padding .data.rel.ro section.
We can do better,
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "gdb and binutils". The branch, master has been updated via 43a8475ca01b676fb764aaed0c4ed1cc16fc3c87 (commit) from 221fd5d598e7dcf7b953150986a501b462b99891 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=43a8475ca01b676fb764aaed0c4ed1cc16fc3c87 commit 43a8475ca01b676fb764aaed0c4ed1cc16fc3c87 Author: H.J. Lu <hjl.tools@gmail.com> Date: Thu Dec 12 10:35:47 2013 -0800 Adjust LOAD segment to generate GNU_RELRO segment This patch fixes 2 GNU_RELRO segment bugs: 1. lang_size_sections didn't properly align base to the maximum alignment power of sections between DATA_SEGMENT_ALIGN and DATA_SEGMENT_RELRO_END. 2. ld failed to adjust LOAD segment to generate GNU_RELRO segment when LOAD segment doesn't fit GNU_RELRO segment. This is https://sourceware.org/bugzilla/show_bug.cgi?id=14207 We "fixed" ld by not generating GNU_RELRO segment. This patch adjusts LOAD segment to generate GNU_RELRO segment. It fixes PR ld/16322 and at the same time it also fixes PR binutils/16323 since now we can adjust LOAD segment if it is too small. bfd/ PR ld/14207 PR ld/16322 PR binutils/16323 * elf.c (_bfd_elf_map_sections_to_segments): Don't check section size for PT_GNU_RELRO segment. (assign_file_positions_for_load_sections): If PT_LOAD segment doesn't fit PT_GNU_RELRO segment, adjust its p_filesz and p_memsz. ld/ PR ld/14207 PR ld/16322 PR binutils/16323 * ldlang.c (lang_size_sections): Properly align RELRO base. ld/testsuite/ PR ld/14207 PR ld/16322 PR binutils/16323 * ld-elf/pr16322.d: New file. * ld-elf/pr16322.s: Likewise. * ld-x86-64/pr14207.d: Expect PT_GNU_RELRO segment. ----------------------------------------------------------------------- Summary of changes: bfd/ChangeLog | 10 +++++++++ bfd/elf.c | 41 +++++++++++++++++++++++++++++++++---- ld/ChangeLog | 7 ++++++ ld/ldlang.c | 3 +- ld/testsuite/ChangeLog | 10 +++++++++ ld/testsuite/ld-elf/pr16322.d | 7 ++++++ ld/testsuite/ld-elf/pr16322.s | 6 +++++ ld/testsuite/ld-x86-64/pr14207.d | 23 +++++++++++++++++--- 8 files changed, 97 insertions(+), 10 deletions(-) create mode 100644 ld/testsuite/ld-elf/pr16322.d create mode 100644 ld/testsuite/ld-elf/pr16322.s
Fixed.
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "gdb and binutils". The branch, master has been updated via eec2f3ed9f053653ed5d629eb50e08e3ee61e9bd (commit) from a2cd8cfed14491303eb8338f90e206034c5a3fe2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=eec2f3ed9f053653ed5d629eb50e08e3ee61e9bd commit eec2f3ed9f053653ed5d629eb50e08e3ee61e9bd Author: Alan Modra <amodra@gmail.com> Date: Fri Jan 10 21:11:46 2014 +1030 Don't adjust LOAD segment to match GNU_RELRO segment Instead, fix Jakub's original code setting up the PR_GNU_RELRO header from the PT_LOAD header. PR ld/14207 PR ld/16322 PR binutils/16323 bfd/ * elf.c (assign_file_positions_for_load_sections): Revert last change. (assign_file_positions_for_non_load_sections): When setting up PT_GNU_RELRO header, don't require a corresponding PT_LOAD header that completely covers the relro region. ld/ * ldlang.c (lang_size_sections): Remove unneeded RELRO base adjust. Tidy comments. * ld.texinfo (DATA_SEGMENT_RELRO_END): Correct description. ld/testsuite/ * ld-x86-64/pr14207.d: Adjust ----------------------------------------------------------------------- Summary of changes: bfd/ChangeLog | 10 ++++++++++ bfd/elf.c | 37 ------------------------------------- ld/ChangeLog | 9 +++++++++ ld/ld.texinfo | 6 ++++-- ld/ldlang.c | 21 +++++++++------------ ld/testsuite/ChangeLog | 4 ++++ ld/testsuite/ld-x86-64/pr14207.d | 2 +- 7 files changed, 37 insertions(+), 52 deletions(-)