This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
RE: How do I prevent ld from merging PT_LOAD segments?
- From: Jeff Baker <jbaker at qnx dot com>
- To: Jeff Baker <jbaker at qnx dot com>, "'binutils at sources dot redhat dot com'" <binutils at sources dot redhat dot com>
- Date: Wed, 9 Jul 2003 15:56:13 -0400
- Subject: RE: How do I prevent ld from merging PT_LOAD segments?
Ping.
Oh, I was wrong about sh4. sh4 seems to work. It's just our arm and ppc
ports that are broken.
> In case it helps, here are two objdumps. The first is of a correct binary
> linked with the 2.10.1 linker. The second is a bad binary linked with the
> 2.12.1 linker. Both were linked from the same object files and using the
> same linker script. I left off the symbol tables to keep this as short as
> possible.
>
> portmap-good: file format elf32-littlearm
> portmap-good
> architecture: arm, flags 0x00000112:
> EXEC_P, HAS_SYMS, D_PAGED
> start address 0x00100bcc
>
> Program Header:
> PHDR off 0x00000034 vaddr 0x00100034 paddr 0x00000000 align 2**2
> filesz 0x000000c0 memsz 0x000000c0 flags r-x
> INTERP off 0x000000f4 vaddr 0x001000f4 paddr 0x00000000 align 2**0
> filesz 0x00000014 memsz 0x00000014 flags r--
> LOAD off 0x00000000 vaddr 0x00100000 paddr 0x00100000 align 2**12
> filesz 0x00001cb0 memsz 0x00001cb0 flags r-x
> LOAD off 0x00001cb0 vaddr 0x00102cb0 paddr 0x00102cb0 align 2**12
> filesz 0x00000164 memsz 0x00000204 flags rw-
> DYNAMIC off 0x00001d7c vaddr 0x00102d7c paddr 0x00000000 align 2**2
> filesz 0x00000098 memsz 0x00000098 flags rw-
> NOTE off 0x00001e14 vaddr 0x00000000 paddr 0x00000000 align 2**2
> filesz 0x00000050 memsz 0x00000000 flags ---
>
> Dynamic Section:
> NEEDED librpc.so.2
> NEEDED libsocket.so.2
> NEEDED libc.so.2
> INIT 0x100950
> FINI 0x101ca4
> HASH 0x100108
> STRTAB 0x1005f0
> SYMTAB 0x100280
> STRSZ 0x21f
> SYMENT 0x10
> DEBUG 0x0
> PLTGOT 0x102cd0
> PLTRELSZ 0x130
> PLTREL 0x11
> JMPREL 0x100820
> REL 0x100810
> RELSZ 0x10
> RELENT 0x8
> private flags = 0: [interworking not enabled] [APCS-32] [floats passed in
> integer registers] [absolute position]
>
> Sections:
> Idx Name Size VMA LMA File off Algn
> 0 .interp 00000014 001000f4 001000f4 000000f4 2**0
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 1 .note 00000000 00100108 00100108 00000108 2**0
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 2 .hash 00000178 00100108 00100108 00000108 2**2
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 3 .dynsym 00000370 00100280 00100280 00000280 2**2
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 4 .dynstr 0000021f 001005f0 001005f0 000005f0 2**0
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 5 .rel.bss 00000010 00100810 00100810 00000810 2**2
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 6 .rel.plt 00000130 00100820 00100820 00000820 2**2
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 7 .init 0000000c 00100950 00100950 00000950 2**2
> CONTENTS, ALLOC, LOAD, READONLY, CODE
> 8 .plt 00000270 0010095c 0010095c 0000095c 2**2
> CONTENTS, ALLOC, LOAD, READONLY, CODE
> 9 .text 000010d8 00100bcc 00100bcc 00000bcc 2**2
> CONTENTS, ALLOC, LOAD, READONLY, CODE
> 10 .fini 0000000c 00101ca4 00101ca4 00001ca4 2**2
> CONTENTS, ALLOC, LOAD, READONLY, CODE
> 11 .data 00000010 00102cb0 00102cb0 00001cb0 2**2
> CONTENTS, ALLOC, LOAD, DATA
> 12 .ctors 00000008 00102cc0 00102cc0 00001cc0 2**2
> CONTENTS, ALLOC, LOAD, DATA
> 13 .dtors 00000008 00102cc8 00102cc8 00001cc8 2**2
> CONTENTS, ALLOC, LOAD, DATA
> 14 .got 000000ac 00102cd0 00102cd0 00001cd0 2**2
> CONTENTS, ALLOC, LOAD, DATA
> 15 .dynamic 00000098 00102d7c 00102d7c 00001d7c 2**2
> CONTENTS, ALLOC, LOAD, DATA
> 16 .bss 000000a0 00102e14 00102e14 00001e14 2**3
> ALLOC
> 17 QNX_usage 00000003 00000000 00000000 00002a6c 2**0
> CONTENTS, READONLY
> 18 QNX_info 000000a4 00000000 00000000 00002a6f 2**0
> CONTENTS, READONLY
>
> =================================================================
>
> portmap: file format elf32-littlearm
> portmap
> architecture: arm, flags 0x00000112:
> EXEC_P, HAS_SYMS, D_PAGED
> start address 0x00100b9c
>
> Program Header:
> PHDR off 0x00000034 vaddr 0x00100034 paddr 0x00100034 align 2**2
> filesz 0x000000c0 memsz 0x000000c0 flags r-x
> INTERP off 0x000000f4 vaddr 0x001000f4 paddr 0x001000f4 align 2**0
> filesz 0x00000014 memsz 0x00000014 flags r--
> LOAD off 0x00000000 vaddr 0x00100000 paddr 0x00100000 align 2**15
> filesz 0x00002e0c memsz 0x00002eac flags rwx
> DYNAMIC off 0x00002c90 vaddr 0x00102c90 paddr 0x00102c90 align 2**2
> filesz 0x000000c0 memsz 0x000000c0 flags rw-
> NOTE off 0x00000108 vaddr 0x00100108 paddr 0x00100108 align 2**0
> filesz 0x00000000 memsz 0x00000000 flags r--
>
> Dynamic Section:
> NEEDED librpc.so.2
> NEEDED libsocket.so.2
> NEEDED libc.so.2
> INIT 0x100920
> FINI 0x101c74
> HASH 0x100108
> STRTAB 0x1005dc
> SYMTAB 0x10027c
> STRSZ 0x202
> SYMENT 0x10
> DEBUG 0x0
> PLTGOT 0x102d60
> PLTRELSZ 0x130
> PLTREL 0x11
> JMPREL 0x1007f0
> REL 0x1007e0
> RELSZ 0x10
> RELENT 0x8
> private flags = 2: [interworking not enabled] [APCS-32] [floats passed in
> integer registers] [absolute position]
>
> Sections:
> Idx Name Size VMA LMA File off Algn
> 0 .interp 00000014 001000f4 001000f4 000000f4 2**0
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 1 .note 00000000 00100108 00100108 00000108 2**0
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 2 .hash 00000174 00100108 00100108 00000108 2**2
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 3 .dynsym 00000360 0010027c 0010027c 0000027c 2**2
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 4 .dynstr 00000202 001005dc 001005dc 000005dc 2**0
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 5 .rel.bss 00000010 001007e0 001007e0 000007e0 2**2
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 6 .rel.plt 00000130 001007f0 001007f0 000007f0 2**2
> CONTENTS, ALLOC, LOAD, READONLY, DATA
> 7 .init 0000000c 00100920 00100920 00000920 2**2
> CONTENTS, ALLOC, LOAD, READONLY, CODE
> 8 .plt 00000270 0010092c 0010092c 0000092c 2**2
> CONTENTS, ALLOC, LOAD, READONLY, CODE
> 9 .text 000010d8 00100b9c 00100b9c 00000b9c 2**2
> CONTENTS, ALLOC, LOAD, READONLY, CODE
> 10 .fini 0000000c 00101c74 00101c74 00001c74 2**2
> CONTENTS, ALLOC, LOAD, READONLY, CODE
> 11 .data 00000010 00102c80 00102c80 00002c80 2**2
> CONTENTS, ALLOC, LOAD, DATA
> 12 .dynamic 000000c0 00102c90 00102c90 00002c90 2**2
> CONTENTS, ALLOC, LOAD, DATA
> 13 .ctors 00000008 00102d50 00102d50 00002d50 2**2
> CONTENTS, ALLOC, LOAD, DATA
> 14 .dtors 00000008 00102d58 00102d58 00002d58 2**2
> CONTENTS, ALLOC, LOAD, DATA
> 15 .got 000000ac 00102d60 00102d60 00002d60 2**2
> CONTENTS, ALLOC, LOAD, DATA
> 16 .bss 000000a0 00102e0c 00102e0c 00002e0c 2**3
> ALLOC
>
> > -----Original Message-----
> > From: Jeff Baker [mailto:jbaker@qnx.com]
> > Sent: July 7, 2003 4:08 PM
> > To: 'binutils@sources.redhat.com'
> > Subject: How do I prevent ld from merging PT_LOAD segments?
> >
> > We're currently in the process of moving from binutils-2.10.1 (Wow,
> that's
> > old) to binutils-2.12.1 (Wow, that's... not quite so old). I've
> observed
> > a
> > new behaviour that I've confirmed is also in the current head branch.
> >
> > The newer binutils (arm, ppc and sh4) seem to be merging two PT_LOAD
> > segments into one (x86 and mips don't). For various reasons we need to
> > have
> > both of these segments separate.
> >
> > My wild, uninformed theory is that this is the result of a new feature
> > added
> > after 2.10.1 that can be overridden somewhere in the linker scripts.
> > Whether I'm correct or not, I don't know how to deal with this. I would
> > appreciate an explanation of this behaviour if someone is feeling
> > benevolent
> > enough to give me one.
> >
> > Thanks,
> > Jeff