This is the mail archive of the 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: Internal use of vsnprintf

On 05/03/2016 06:57 PM, Joseph Myers wrote:
On Tue, 3 May 2016, Florian Weimer wrote:

How do I do that?  We have an __vsnprintf definition in include/stdio.h, but I
can't find a libc_hidden_proto/libc_hidden_define for it, and I get a PLT
check failure as a result if I use it.

Because __vsnprintf is an exported symbol (in libio/Versions).

Ahh, and _IO_vsnprintf is not. That's what I was missing, thanks. This is also how __snprintf works.

Or should I call _IO_vsnprintf instead (which is what the snprintf
implementation does)?  I don't see the usual PLT avoidance stuff in the
sources for _IO_vsnprintf, but it does happen.  So how does it work?

If you call a function that's not exported from a shared library, then
properly you should also declare it with attribute_hidden to get the same
optimization as you get for an exported function using libc_hidden_* (you
can use libc_hidden_* to create and use aliases for a non-exported
function, that's just unnecessarily complicated compared to declaring it
hidden).  For most architectures this doesn't matter (you don't get any
better optimization that way), but declaring it hidden helps for 32-bit
x86, where the ABI means a call to a function known at compile time to be
in the same shared library can be more efficient (see bug 18822).

In the _IO_snprintf case, I have to include <libioP.h>, which is not great because it contains truly internal libio stuff as well. Should I use this approach nevertheless, or somehow arrange for PLT avoidance for __vsnprintf (perhaps following the example of _IO_vsprintf)?


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