[PATCH 6/9] Add __vsyslog_internal, with same flags as __v*printf_internal.
Florian Weimer
fweimer@redhat.com
Tue Mar 13 13:50:00 GMT 2018
On 03/13/2018 02:37 PM, Zack Weinberg wrote:
> On Tue, Mar 13, 2018 at 8:43 AM, Florian Weimer <fweimer@redhat.com> wrote:
>> On 03/13/2018 01:39 PM, Zack Weinberg wrote:
>>>
>>> On Tue, Mar 13, 2018 at 7:59 AM, Florian Weimer <fweimer@redhat.com>
>>> wrote:
>>>>
>>>> On 03/07/2018 08:32 PM, Zack Weinberg wrote:
>>>>
>>>>> +/* __vsyslog_internal uses the same mode_flags bits as
>>>>> + __v*printf_internal; see libio/libioP.h. */
>>>>> +extern void __vsyslog_internal (int pri, const char *fmt,
>>>>> __gnuc_va_list
>>>>> ap,
>>>>> + unsigned int mode_flags)
>>>>> + __attribute__ ((__format__ (__printf__, 2, 0)));
>>>>
>>>>
>>>>
>>>> I'm surprised that this doesn't need attribute_hidden or
>>>> libc_hidden_proto
>>>> to avoid new PLT calls.
>>>
>>>
>>> That's only needed for functions that will be called _both_ from
>>> inside and outside glibc. This function is only ever called from
>>> inside glibc, so it doesn't appear in any Versions files and it's
>>> hidden by default.
>>
>>
>> Some architectures will still use indirect calls without attribute_hidden,
>> so please add it. The existing tests do not catch this reliably
>> unfortunately.
>
> Can you be more specific? This will affect all of the other new
> __*_internal functions added in this patchset, so I need to know how
> to be sure I got it right. Also, this seems like something we should
> find a way to automate if at all possible.
Consider this code:
$ cat call.c
int external (void) ATTR;
int
call (void)
{
return external () + 1;
}
With default visibility, GCC 7 produces:
$ ppc64-linux-gnu-gcc -m32 -fPIC -c -O2 -DATTR= call.c &&
ppc64-linux-gnu-objdump -d --reloc call.o
call.o: file format elf32-powerpc
Disassembly of section .text:
00000000 <call>:
0: 94 21 ff e0 stwu r1,-32(r1)
4: 7c 08 02 a6 mflr r0
8: 42 9f 00 05 bcl 20,4*cr7+so,c <call+0xc>
c: 93 c1 00 18 stw r30,24(r1)
10: 7f c8 02 a6 mflr r30
14: 90 01 00 24 stw r0,36(r1)
18: 3f de 00 00 addis r30,r30,0
1a: R_PPC_REL16_HA .got2+0x800e
1c: 3b de 00 00 addi r30,r30,0
1e: R_PPC_REL16_LO .got2+0x8012
20: 48 00 00 01 bl 20 <call+0x20>
20: R_PPC_PLTREL24 external+0x8000
24: 80 01 00 24 lwz r0,36(r1)
28: 83 c1 00 18 lwz r30,24(r1)
2c: 38 21 00 20 addi r1,r1,32
30: 38 63 00 01 addi r3,r3,1
34: 7c 08 03 a6 mtlr r0
38: 4e 80 00 20 blr
With hidden visibility, we get instead:
$ ppc64-linux-gnu-gcc -m32 -fPIC -c -O2 -DATTR='__attribute ((visibility
("hidden")))' call.c && ppc64-linux-gnu-objdump -d --reloc call.o
call.o: file format elf32-powerpc
Disassembly of section .text:
00000000 <call>:
0: 94 21 ff e0 stwu r1,-32(r1)
4: 7c 08 02 a6 mflr r0
8: 93 c1 00 18 stw r30,24(r1)
c: 90 01 00 24 stw r0,36(r1)
10: 48 00 00 01 bl 10 <call+0x10>
10: R_PPC_LOCAL24PC external
14: 80 01 00 24 lwz r0,36(r1)
18: 83 c1 00 18 lwz r30,24(r1)
1c: 38 21 00 20 addi r1,r1,32
20: 38 63 00 01 addi r3,r3,1
24: 7c 08 03 a6 mtlr r0
28: 4e 80 00 20 blr
The linker may have some optimization to eliminate the PLT indirection
(blinding the localplt test), but it cannot get rid of the other
unnecessary instructions.
Does this example help?
Thanks,
Florian
More information about the Libc-alpha
mailing list