This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc 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] aarch64: Check PIC instead of SHARED in start.S


On 10/6/17, Szabolcs Nagy <szabolcs.nagy@arm.com> wrote:
> On 06/10/17 13:34, H.J. Lu wrote:
>> On 10/6/17, Szabolcs Nagy <szabolcs.nagy@arm.com> wrote:
>>> On 03/10/17 16:31, Szabolcs Nagy wrote:
>>>> On 03/10/17 11:39, Szabolcs Nagy wrote:
>>>>> On 02/10/17 12:20, H.J. Lu wrote:
>>>>>> On 10/2/17, Szabolcs Nagy <szabolcs.nagy@arm.com> wrote:
>>>>>>> On 29/09/17 22:32, H.J. Lu wrote:
>>>>>>>> Since start.o may be compiled as PIC, we should check PIC instead
>>>>>>>> of
>>>>>>>> SHARED.
>>>>>>>>
>>>>>>>> OK for master?
>>>>>>>>
>>>>>>>
>>>>>>> i believe that the compile/link tests worked..
>>>>>>
>>>>>> Does static PIE of hjl/pie/static branch run on arm and aarch64?
>>>>>>
>>>>>
>>>>> no, if i build with --enable-static-pie the install step
>>>>> fails when the static linked sln runs.
>>>>>
>>>>> there are relative relocs against the func ptrs that are
>>>>> loaded from GOT in the startup code, but execution fails
>>>>> even before those are used because there are R*_JUMP_SLOT
>>>>> and R*_GLOB_DAT relocs which are not processed correctly.
>>>>>
>>>>> in particular in
>>>>>   if (__pthread_initialize_minimal != NULL)
>>>>>     __pthread_initialize_minimal ();
>>>>> the symbol value loaded from GOT is non-NULL even though
>>>>> there is no pthread linked in, that is probably a linker bug.
>>>>>
>>>>
>>>> it seems weak extern symbol is accessed via got and at
>>>> link time that is not relaxed to 0 with -static -pie
>>>> and the got entry is not initialized to 0 either.
>>>
>>> aarch64 dl-machine.h has
>>>
>>>       struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
>>>       ElfW(Addr) value = sym_map == NULL ? 0 : sym_map->l_addr +
>>> sym->st_value;
>>>
>>> x86_64 has
>>>
>>>       struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
>>>       ElfW(Addr) value = (sym == NULL ? 0
>>> 			  : (ElfW(Addr)) sym_map->l_addr + sym->st_value);
>>>
>>> sym_map is always == BOOTSTRAP_MAP in case of static pie, so
>>> tye sym_map == NULL check is not true on aarch64 case for weak
>>> undef symbols.
>>>
>>> so either targets need to be fixed to not use sym_map check
>>> for detecting undef weak (powerpc32, powerpc64, aarch64,
>>> i386, arm, sh, sparc32, sparc64) or RESOLVE_MAP should not
>>> be unconditionally set to BOOTSTRAP_MAP in _dl_relocate_static_pie
>>> (since that is not true for undef symbols)
>>>
>>
>> It shouldn't matter.  All undefined weak symbols should be resolved
>> to 0 in static PIE by linker.  See:
>>
>> https://sourceware.org/bugzilla/show_bug.cgi?id=22269
>>
>
> ok, thanks for the bug report, but i prefer to also
> fix the dynamic linker to try set abs/got/jumpslot

Sure.

> relocs for weak undef syms to 0, so it can work with
> earlier binutils.
>
>

Please try binutils users/hjl/pr22269 branch.  aarch64 may need to check
UNDEFINED_WEAK_RESOLVED_TO_ZERO in more places.


-- 
H.J.


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