This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH glibc 2/2] aarch64: handle STO_AARCH64_VARIANT_PCS
- From: Szabolcs Nagy <Szabolcs dot Nagy at arm dot com>
- To: Florian Weimer <fweimer at redhat dot com>
- Cc: nd <nd at arm dot com>, "libc-alpha at sourceware dot org" <libc-alpha at sourceware dot org>, Rich Felker <dalias at libc dot org>, Peter Smith <peter dot smith at linaro dot org>, Richard Earnshaw <Richard dot Earnshaw at arm dot com>, Richard Sandiford <Richard dot Sandiford at arm dot com>, Tejas Belagod <Tejas dot Belagod at arm dot com>
- Date: Tue, 4 Jun 2019 17:17:29 +0000
- Subject: Re: [PATCH glibc 2/2] aarch64: handle STO_AARCH64_VARIANT_PCS
- References: <3c35b5f5-b13b-5e75-f0ed-2cbf788d83cf@arm.com> <35229f84-57b4-5ca3-badb-82926bb6bb74@arm.com> <87o93txv23.fsf@oldenburg2.str.redhat.com> <1330a818-213a-13a9-3a33-48933cc22c6a@arm.com> <2d825839-e919-9b4c-dab7-8882bf8ff54e@arm.com>
On 04/06/2019 12:39, Szabolcs Nagy wrote:
> On 23/05/2019 13:31, Szabolcs Nagy wrote:
>> On 23/05/2019 12:35, Florian Weimer wrote:
>>> * Szabolcs Nagy:
>>>
>>>> /* Check for unexpected PLT reloc type. */
>>>> if (__builtin_expect (r_type == AARCH64_R(JUMP_SLOT), 1))
>>>> {
>>>> - if (__builtin_expect (map->l_mach.plt, 0) == 0)
>>>> - *reloc_addr += l_addr;
>>>> - else
>>>> - *reloc_addr = map->l_mach.plt;
>>>> + if (map->l_mach.plt == 0)
>>>> + {
>>>> + /* Prelinking. */
>>>> + *reloc_addr += l_addr;
>>>> + return;
>>>> + }
>>>> +
>>>> + if (__glibc_unlikely (map->l_mach.variant_pcs))
>>>> + {
>>>> + /* Check the symbol table for variant PCS symbols. */
>>>> + const Elf_Symndx symndx = ELFW (R_SYM) (reloc->r_info);
>>>> + const ElfW (Sym) *symtab =
>>>> + (const void *)D_PTR (map, l_info[DT_SYMTAB]);
>>>> + const ElfW (Sym) *sym = &symtab[symndx];
>>>> + if (__glibc_unlikely (sym->st_other & STO_AARCH64_VARIANT_PCS))
>>>> + {
>>>> + /* Avoid lazy resolution of variant PCS symbols. */
>>>> + const struct r_found_version *version = NULL;
>>>> + if (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
>>>> + {
>>>> + const ElfW (Half) *vernum =
>>>> + (const void *)D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
>>>> + version = &map->l_versions[vernum[symndx] & 0x7fff];
>>>> + }
>>>> + elf_machine_rela (map, reloc, sym, version, reloc_addr,
>>>> + skip_ifunc);
>>>> + return;
>>>> + }
>>>> + }
>>>> +
>>>> + *reloc_addr = map->l_mach.plt;
>>>
>>> Looking at this, I wonder if it would be more natural to handle this as
>>> a new relocation type. This way, you will get an error from old dynamic
>>> linkers.
>>
>> yes, but that's a more intrusive change.
>
> to expand a bit: i want old dynamic linkers to
> continue to work if they do not use lazy binding.
Rich Felker commented that it's possible to force bind now
semantics for marked symbols in the static linker.
PLT entries may still be needed (e.g. in the main exe for
pointer equality), but those can use R_*_GLOB_DAT relocs
and appear outside of the normal PLT entries that are
associated with R_*_JUMP_SLOT relocs.
then no dynamic linker change is needed, but lazy binding
(and ld_audit) cannot be supported later for vector calls.
no dynamic linker change sounds preferable to me, but
i have to think about the details.