This is the mail archive of the
mailing list for the binutils project.
Re: Adding static-PIE support to binutils
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Rich Felker <dalias at libc dot org>
- Cc: Binutils <binutils at sourceware dot org>, GCC Development <gcc at gcc dot gnu dot org>
- Date: Mon, 17 Aug 2015 15:56:57 -0700
- Subject: Re: Adding static-PIE support to binutils
- Authentication-results: sourceware.org; auth=none
- References: <20150624041847 dot GA26414 at brightrain dot aerifal dot cx> <CAMe9rOoQCDXZK_LTCt81+WvtBLsnNbGDR10_aKe4s8D+-3Ehng at mail dot gmail dot com> <20150817224338 dot GE32742 at brightrain dot aerifal dot cx>
On Mon, Aug 17, 2015 at 3:43 PM, Rich Felker <email@example.com> wrote:
> On Mon, Aug 17, 2015 at 02:19:34PM -0700, H.J. Lu wrote:
>> On Tue, Jun 23, 2015 at 9:18 PM, Rich Felker <firstname.lastname@example.org> wrote:
>> > For background on the static PIE model I'm working with, see the
>> > following post to the GCC list:
>> > https://gcc.gnu.org/ml/gcc/2015-06/msg00008.html
>> > So far, I've been prototyping static PIE support by having GCC pass
>> > the following options to ld instead of -static -pie:
>> > -static -shared -Bsymbolic
>> > This partly works, but since ld does not know it's producing a main
>> > executable, it misses important details, including the ability to link
>> > initial-exec and local-exec model TLS code correctly, as well as
>> > various linking optimizations. So I think the right way forward is
>> > making ld accept -static and -pie together to do the right thing.
>> > In elflink.c, _bfd_elf_link_create_dynamic_sections assumes that
>> > executables should always have a .interp section.
>> > bfd_elf_size_dynamic_sections asserts this assumption again, and the
>> > individual elf??-*.c files also do so in *_elf_size_dynamic_sections
>> > where they set a default interpreter. (Is this even useful? Most of
>> > the names are out of touch with reality, and GCC always passes an
>> > explicit -dynamic-linker anyway, so I think this code should just be
>> > removed.)
>> > Now I have a working prototype by changing the info->executable
>> > condition to info->executable && info->dynamic, and having lexsup.c
>> > store the value of input_flags.dynamic in link_info.dynamic after
>> > processing the command line, but I'm not sure if this is the right
>> > approach.
>> It is OK to use -static/-Bstatic/-non_shared with -shared and -pie.
>> I think you want --no-dynamic-linker.
> Yes, I was concerned someone might say that. I could certainly add a
> --no-dynamic-linker option, but then how should it work on the gcc
> side? Having to use -Wl,--no-dynamic-linker to get static-pie would be
> a significant obstacle to actual usage, I think. The gcc specs could
> automatically pass --no-dynamic-linker when -static is passed to gcc,
> assuming users who want to do weird mixes of static and dynamic
> linking would use -Wl,-Bstatic rather than -static. After all, gcc
> needs to know it's asking for static-pie anyway in order to use the
> right startfile. Does that seem reasonable?
I think it is seasonable for gcc to pass --no-dynamic-linker to ld
when -static is used if ld supports it.