[RESEND] Makeconfig: Set pie-ccflag to -fPIE by default
Checks
Context |
Check |
Description |
dj/TryBot-apply_patch |
success
|
Patch applied to master at the time it was sent
|
dj/TryBot-32bit |
success
|
Build for i686
|
Commit Message
[ I never saw this arrive in the list archives.
Trying again with my linaro address subscribed. ]
We should default to the larger code model, in order to support
larger applications built with -static -pie. This should be
consistent with pic-ccflag, which defaults to -fPIC.
Remove the now redundant override from sysdeps/sparc/Makefile.
Note that -fno-pie and -fno-PIE have the same effect.
---
In the case of AArch64, the code changes are small but significant:
0000000000000000 <__libc_init_first>:
0: a9bd7bfd stp x29, x30, [sp, #-48]!
- 4: 90000003 adrp x3, 0 <_GLOBAL_OFFSET_TABLE_>
- 4: R_AARCH64_ADR_PREL_PG_HI21 _GLOBAL_OFFSET_TABLE_
+ 4: 90000003 adrp x3, 0 <__environ>
+ 4: R_AARCH64_ADR_GOT_PAGE __environ
8: 90000004 adrp x4, 0 <__libc_init_first>
8: R_AARCH64_ADR_PREL_PG_HI21 .bss
c: 910003fd mov x29, sp
10: f9400063 ldr x3, [x3]
- 10: R_AARCH64_LD64_GOTPAGE_LO15 __environ
+ 10: R_AARCH64_LD64_GOT_LO12_NC __environ
In the small model, we are constrained to 15 bits of GOT, with a
single shared base, _GLOBAL_OFFSET_TABLE_. In the large model,
each symbol has a page + offset pair. For small functions like
this, where there are no other variable references to share the
common GOT pointer, there is no actual code change.
r~
---
Makeconfig | 2 +-
sysdeps/sparc/Makefile | 3 ---
2 files changed, 1 insertion(+), 4 deletions(-)
Comments
On 25/08/22 18:01, Richard Henderson via Libc-alpha wrote:
> [ I never saw this arrive in the list archives.
> Trying again with my linaro address subscribed. ]
>
> We should default to the larger code model, in order to support
> larger applications built with -static -pie. This should be
> consistent with pic-ccflag, which defaults to -fPIC.
>
> Remove the now redundant override from sysdeps/sparc/Makefile.
> Note that -fno-pie and -fno-PIE have the same effect.
>
> ---
>
> In the case of AArch64, the code changes are small but significant:
>
> 0000000000000000 <__libc_init_first>:
> 0: a9bd7bfd stp x29, x30, [sp, #-48]!
> - 4: 90000003 adrp x3, 0 <_GLOBAL_OFFSET_TABLE_>
> - 4: R_AARCH64_ADR_PREL_PG_HI21 _GLOBAL_OFFSET_TABLE_
> + 4: 90000003 adrp x3, 0 <__environ>
> + 4: R_AARCH64_ADR_GOT_PAGE __environ
> 8: 90000004 adrp x4, 0 <__libc_init_first>
> 8: R_AARCH64_ADR_PREL_PG_HI21 .bss
> c: 910003fd mov x29, sp
> 10: f9400063 ldr x3, [x3]
> - 10: R_AARCH64_LD64_GOTPAGE_LO15 __environ
> + 10: R_AARCH64_LD64_GOT_LO12_NC __environ
>
> In the small model, we are constrained to 15 bits of GOT, with a
> single shared base, _GLOBAL_OFFSET_TABLE_. In the large model,
> each symbol has a page + offset pair. For small functions like
> this, where there are no other variable references to share the
> common GOT pointer, there is no actual code change.
>
> r~
I recall that powerpc wanted to use -mcmodel=large, but it would require to
adjust a lot of assembly implementations. Are we sure this change does not
trigger any regression with current glibc code?
> ---
> Makeconfig | 2 +-
> sysdeps/sparc/Makefile | 3 ---
> 2 files changed, 1 insertion(+), 4 deletions(-)
>
> diff --git a/Makeconfig b/Makeconfig
> index e78cf220af..f8164a0025 100644
> --- a/Makeconfig
> +++ b/Makeconfig
> @@ -1052,7 +1052,7 @@ pic-ccflag = -fPIC
> PIC-ccflag = -fPIC
> endif
> # This can be changed by a sysdep makefile
> -pie-ccflag = -fpie
> +pie-ccflag = -fPIE
> no-pie-ccflag = -fno-pie
> # This one should always stay like this unless there is a very good reason.
> PIE-ccflag = -fPIE
> diff --git a/sysdeps/sparc/Makefile b/sysdeps/sparc/Makefile
> index 12c2c1b085..26b4a84606 100644
> --- a/sysdeps/sparc/Makefile
> +++ b/sysdeps/sparc/Makefile
> @@ -1,9 +1,6 @@
> # The Sparc `long double' is a distinct type we support.
> long-double-fcts = yes
>
> -pie-ccflag = -fPIE
> -no-pie-ccflag = -fno-PIE
> -
> ifeq ($(subdir),gmon)
> sysdep_routines += sparc-mcount
> endif
On 8/26/22 05:32, Adhemerval Zanella Netto wrote:
>
>
> On 25/08/22 18:01, Richard Henderson via Libc-alpha wrote:
>> [ I never saw this arrive in the list archives.
>> Trying again with my linaro address subscribed. ]
>>
>> We should default to the larger code model, in order to support
>> larger applications built with -static -pie. This should be
>> consistent with pic-ccflag, which defaults to -fPIC.
>>
>> Remove the now redundant override from sysdeps/sparc/Makefile.
>> Note that -fno-pie and -fno-PIE have the same effect.
>>
>> ---
>>
>> In the case of AArch64, the code changes are small but significant:
>>
>> 0000000000000000 <__libc_init_first>:
>> 0: a9bd7bfd stp x29, x30, [sp, #-48]!
>> - 4: 90000003 adrp x3, 0 <_GLOBAL_OFFSET_TABLE_>
>> - 4: R_AARCH64_ADR_PREL_PG_HI21 _GLOBAL_OFFSET_TABLE_
>> + 4: 90000003 adrp x3, 0 <__environ>
>> + 4: R_AARCH64_ADR_GOT_PAGE __environ
>> 8: 90000004 adrp x4, 0 <__libc_init_first>
>> 8: R_AARCH64_ADR_PREL_PG_HI21 .bss
>> c: 910003fd mov x29, sp
>> 10: f9400063 ldr x3, [x3]
>> - 10: R_AARCH64_LD64_GOTPAGE_LO15 __environ
>> + 10: R_AARCH64_LD64_GOT_LO12_NC __environ
>>
>> In the small model, we are constrained to 15 bits of GOT, with a
>> single shared base, _GLOBAL_OFFSET_TABLE_. In the large model,
>> each symbol has a page + offset pair. For small functions like
>> this, where there are no other variable references to share the
>> common GOT pointer, there is no actual code change.
>>
>> r~
>
> I recall that powerpc wanted to use -mcmodel=large, but it would require to
> adjust a lot of assembly implementations. Are we sure this change does not
> trigger any regression with current glibc code?
Ah, the resend is missing some detail I included in the original:
> For s390x, I would expect changes similar to c64a10e54441, and
> an eventual similar bug report if this were left unchanged.
>
> For x86, ppc64 and riscv64, -fpie & -fPIE are identical.
For ppc64 specifically, I audited gcc/config/rs6000/ for references to flag_pic, and the
only changes between -fpic and -fPIC are for 32-bit ABI_V4.
More generally, our assembly is already set up for -fPIC, which is the pic-ccflag default;
the difference for -fPIE is only in the selection of external vs local binding.
For aarch64, I've audited uses of the adrp instruction in sysdeps/, and they are what I'd
expect, e.g.
aarch64/start.S: adrp x0, :got:main
and there are no instances of '_GLOBAL_OFFSET_TABLE_', which is indicative of -fpic.
For s390, I've similarly audited uses of the larl instruction:
s390/s390-64/start.S: larl %r2,main@GOTENT # load pointer to main
r~
@@ -1052,7 +1052,7 @@ pic-ccflag = -fPIC
PIC-ccflag = -fPIC
endif
# This can be changed by a sysdep makefile
-pie-ccflag = -fpie
+pie-ccflag = -fPIE
no-pie-ccflag = -fno-pie
# This one should always stay like this unless there is a very good reason.
PIE-ccflag = -fPIE
@@ -1,9 +1,6 @@
# The Sparc `long double' is a distinct type we support.
long-double-fcts = yes
-pie-ccflag = -fPIE
-no-pie-ccflag = -fno-PIE
-
ifeq ($(subdir),gmon)
sysdep_routines += sparc-mcount
endif