This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: PR ld/16428: Disallow -shared/-pie, -shared/-static, -pie/-static


On Tue, Jan 14, 2014 at 11:37 AM, Joseph S. Myers
<joseph@codesourcery.com> wrote:
> On Tue, 14 Jan 2014, H.J. Lu wrote:
>
>> When there is -static, -dynamic-linker won't passed to ld.  -static,
>> -shared, -pie should be mutually exclusive for GCC driver.
>
> A static PIE shouldn't specify an interpreter; it should handle all
> dynamic relocation processing itself.  Thus, it's correct not to specify
> -dynamic-linker when building a static PIE.

If -dynamic-linker isn't specified, linker will use
the default dynamic linker:

[hjl@gnu-6 pr16428]$ cat x.c
int main() { return 0; }
[hjl@gnu-6 pr16428]$ make
gcc -m32 -B./ -pie -static -fPIE   -c -o x.o x.c
gcc -m32 -B./ -pie -static  -o x x.o
./x
make: ./x: Command not found
make: *** [all] Error 127
[hjl@gnu-6 pr16428]$ readelf -l x

Elf file type is DYN (Shared object file)
Entry point 0x10d0b
There are 8 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x00000034 0x00000034 0x00100 0x00100 R E 0x4
  INTERP         0x000134 0x00000134 0x00000134 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /usr/lib/libc.so.1]
  LOAD           0x000000 0x00000000 0x00000000 0xb6fda 0xb6fda R E 0x1000
  LOAD           0x0b7000 0x000b7000 0x000b7000 0x00e40 0x02534 RW  0x1000
  DYNAMIC        0x0b70b0 0x000b70b0 0x000b70b0 0x000d0 0x000d0 RW  0x4
  NOTE           0x000148 0x00000148 0x00000148 0x00044 0x00044 R   0x4
  TLS            0x0b7000 0x000b7000 0x000b7000 0x00010 0x00028 R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10

 Section to Segment mapping:
  Segment Sections...
   00
   01     .interp
   02     .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym
.dynstr .rel.dyn .rel.plt .init .plt .text __libc_thread_freeres_fn
__libc_freeres_fn .fini .rodata .stapsdt.base __libc_thread_subfreeres
__libc_subfreeres __libc_atexit .eh_frame .gcc_except_table
   03     .tdata .init_array .fini_array .jcr .data.rel.ro .dynamic
.got .got.plt .data .bss __libc_freeres_ptrs
   04     .dynamic

> ld.so itself is a static PIE - it specifies no PT_INTERP or DT_NEEDED, and
> is position-independent.  The concept of an arbitrary program meeting
> those conditions, including a copy of the relevant parts of the dynamic
> linker to relocate itself, is perfectly meaningful; it just so happens
> that glibc, and the associated GCC specs, don't support it, but I'm not
> aware of any fundamental problem with supporting it in ld given
> appropriate startup code and static libc built as PIC.  (I don't know how
> useful more general static PIE support would be.)

-static -PIE may make sense to ld, but not to GCC driver,
at least, not on Linux/x86 where the dynamic linker isn't
/usr/lib/libc.so.1

> (-shared and -pie do seem mutually exclusive, as the first says what's
> being linked operates as a library and the second says it operates as an
> executable - although of course the same ET_DYN can operate as both.)
>
> --
> Joseph S. Myers
> joseph@codesourcery.com



-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]