Post by Michael MatzHi,
Post by H.J. LuAT_PHDR to main, which points to the unmmaped address. We can ask
for kernel change or make kernel happy.
Kernel change does not help because nobody is obligated to use a new
kernel. Binutils would be producing binaries that don't work on
existing kernels (if the note hack were reverted or if similar changes
were added to other archs without a note hack; right now of course
it's working again).
True.
My current .note.gnu.property patch only works for x86. We can add
#define GNU_PROPERTY_PHDRS 3
so that it can be used for all targets.
What would this do?
These are what I have in mind.
I don't see how the patches fix anything, in particular making sure that
the phdrs are always mapped. If your intention is (it would be good if
you can explain it with words) that they only would be made mapped if this
new property is set, then I'd disagree. I think they should always be
made mapped unconditionally. There are two ways for this: (a) add a new
PT_LOAD that covers them, (b) move the phdrs into the ro data segment. I
find all approaches that add properties or new section types or anything
else that needs documentation and definition dubious.
A .note.gnu.property section will lead to a read-only data PT_LOAD segment
as the first PT_LOAD segment:
[***@gnu-17 ld]$ readelf -WlS tmpdir/pr23428
There are 16 section headers, starting at offset 0x2ed0:
Section Headers:
[Nr] Name Type Address Off Size
ES Flg Lk Inf Al
[ 0] NULL 0000000000000000 000000
000000 00 0 0 0
[ 1] .note.gnu.property NOTE 0000000000400158 000158
000030 00 A 0 0 8
[ 2] .text PROGBITS 0000000000401000 001000
0000ea 00 AX 0 0 16
[ 3] .rodata PROGBITS 0000000000402000 002000
000006 01 AMS 0 0 1
[ 4] .comment PROGBITS 0000000000000000 002006
00002d 01 MS 0 0 1
[ 5] .debug_aranges PROGBITS 0000000000000000 002040
000060 00 0 0 16
[ 6] .debug_info PROGBITS 0000000000000000 0020a0
0002f7 00 0 0 1
[ 7] .debug_abbrev PROGBITS 0000000000000000 002397
000137 00 0 0 1
[ 8] .debug_line PROGBITS 0000000000000000 0024ce
0001a7 00 0 0 1
[ 9] .debug_frame PROGBITS 0000000000000000 002678
000040 00 0 0 8
[10] .debug_str PROGBITS 0000000000000000 0026b8
0002a1 01 MS 0 0 1
[11] .debug_loc PROGBITS 0000000000000000 002959
000295 00 0 0 1
[12] .debug_ranges PROGBITS 0000000000000000 002bee
000020 00 0 0 1
[13] .symtab SYMTAB 0000000000000000 002c10
0001e0 18 14 14 8
[14] .strtab STRTAB 0000000000000000 002df0
000030 00 0 0 1
[15] .shstrtab STRTAB 0000000000000000 002e20
0000ab 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
l (large), p (processor specific)
Elf file type is EXEC (Executable file)
Entry point 0x4010c0
There are 5 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flg Align
LOAD 0x000000 0x0000000000400000 0x0000000000400000
0x000188 0x000188 R 0x1000
LOAD 0x001000 0x0000000000401000 0x0000000000401000
0x0000ea 0x0000ea R E 0x1000
LOAD 0x002000 0x0000000000402000 0x0000000000402000
0x000006 0x000006 R 0x1000
NOTE 0x000158 0x0000000000400158 0x0000000000400158
0x000030 0x000030 R 0x8
GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000
0x000000 0x000000 RWE 0x10
Section to Segment mapping:
Segment Sections...
00 .note.gnu.property
01 .text
02 .rodata
03 .note.gnu.property
04
[***@gnu-17 ld]$
--
H.J.