[PATCH 2/4] Check -z single-global-definition and -fsingle-global-definition
Florian Weimer
fweimer@redhat.com
Mon Jun 21 07:43:24 GMT 2021
* H. J. Lu via Libc-alpha:
> 1. Check linker support for -z single-global-definition. If
> GNU_PROPERTY_1_NEEDED_SINGLE_GLOBAL_DEFINITION is set on any input
> relocatable files:
> a. Don't generate copy relocations.
> b. Turn off extern_protected_data.
> c. Treate reference to protected symbols with single global definition
> as local.
> d. Set GNU_PROPERTY_1_NEEDED_SINGLE_GLOBAL_DEFINITION on output.
> e. Add -z [no]single-global-definition to control single global
> definition.
> 2. Check compiler support for -fsingle-global-definition:
> a. Generate a single global definition marker in relocatable objects.
> i. Always use GOT to access undefined data and function symbols,
> including in PIE and non-PIE. These will avoid copy relocations in
> executables.
> ii. This is compatible with existing executables and shared libraries.
> b. In executable and shared library, bind symbols with the STV_PROTECTED
> visibility locally:
> i. The address of data symbol is the address of data body.
> ii. For systems without function descriptor, the function pointer is
> the address of function body.
> iii. The resulting shared libraries may not be incompatible with
> executables which have copy relocations on protected symbols.
>
> Size comparison of non-PIE builds with GCC 12 -O2:
>
> 1. On x86-64:
> text data bss dec hex filename
> 190218 9672 416 200306 30e72 ld.so (original)
> 190258 9336 416 200010 30d4a ld.so (-fsingle-global-definition)
> 1917384 20232 52424 1990040 1e5d98 libc.so (original)
> 1919946 20240 52432 1992618 1e67aa libc.so (-fsingle-global-definition)
> 261734 10339 744 272817 429b1 localedef (original)
> 233084 41734 648 275466 4340a localedef (-fsingle-global-definition)
I must say these numbers do not make sense to me. Why do libc.so and
localedef data sizes increase with -fsingle-global-definition? Fewer
copy relocations should *reduce* data size on both sides. localedef
would have to have nearly 4,000 data relocations to account for the size
increase. And shouldn't the GOT overlap with BSS anyway (so not even
show up in the data column)?
And I don't think we can build glibc with -fsingle-global-definition
anyway because it would be an ABI break.
> ---
> configure | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++-
> configure.ac | 37 ++++++++++++++++++++++++++
> 2 files changed, 109 insertions(+), 1 deletion(-)
>
> diff --git a/configure b/configure
> index 9619c10991..5844dad68f 100755
> --- a/configure
> +++ b/configure
> @@ -732,6 +732,7 @@ infodir
> docdir
> oldincludedir
> includedir
> +runstatedir
> localstatedir
> sharedstatedir
> sysconfdir
Please regenerate with an unpatched autoconf.
Thanks,
Florian
More information about the Libc-alpha
mailing list