aarch64: fix elf_machine_dynamic compile error [BZ #29835]

Message ID 20221202035902.27063-1-linzhuorong@huawei.com
State Superseded
Headers
Series aarch64: fix elf_machine_dynamic compile error [BZ #29835] |

Commit Message

linzhuorong Dec. 2, 2022, 3:59 a.m. UTC
  elf_machine_dynamic compile error when compiling glibc with --enable-static-pie option turned on, static executables do not have symbol _DYNAMIC

Fixes: bca0f5cbc9257c13322b99e55235c4f21ba0bd82("aarch64: Make elf_machine_{load_address,dynamic} robust [BZ #28203]")

Signed-off-by linzhuorong <linzhuorong@huawei.com>
---
 sysdeps/aarch64/dl-machine.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
  

Comments

Szabolcs Nagy Dec. 5, 2022, 2:54 p.m. UTC | #1
The 12/02/2022 11:59, linzhuorong via Libc-alpha wrote:
> elf_machine_dynamic compile error when compiling glibc with --enable-static-pie option turned on, static executables do not have symbol _DYNAMIC

glibc no longer has --enable-static-pie, instead it has
--disable-default-pie .

static pie should have _DYNAMIC symbol since it has dynamic
relocations (relative relocs), what is the binutils version?

maybe glibc should disable default pie if old binutils is
detected.

> 
> Fixes: bca0f5cbc9257c13322b99e55235c4f21ba0bd82("aarch64: Make elf_machine_{load_address,dynamic} robust [BZ #28203]")
> 
> Signed-off-by linzhuorong <linzhuorong@huawei.com>
> ---
>  sysdeps/aarch64/dl-machine.h | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
> index ae8b14425a..49b1d1ea0e 100644
> --- a/sysdeps/aarch64/dl-machine.h
> +++ b/sysdeps/aarch64/dl-machine.h
> @@ -53,8 +53,9 @@ elf_machine_load_address (void)
>  static inline ElfW(Addr) __attribute__ ((unused))
>  elf_machine_dynamic (void)
>  {
> -  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
> -  return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
> +  /* Declaring this hidden ensures that a PC-relative reference is uesed.  */
> +  extern const ElfW(Addr) _GLOBAL_OFFSET_TABLE_[] attribute_hidden;
> +  return _GLOBAL_OFFSET_TABLE_[0];
>  }
>  
>  /* Set up the loaded object described by L so its unrelocated PLT
> -- 
> 2.12.3
>
  
linzhuorong Dec. 7, 2022, 8:34 a.m. UTC | #2
disable-default-pie compile out different results

The problem is why --enable-static-pie works in 7.3.0, but compiles error in 10.3.0?

Error log:
/home/XXXX/workspace/compiler/gcc/build/arm-linux-glibc/arm_linux_glibc_build_dir/arm-linux-glibc/lib/gcc/arm-linux-gnueabi/10.3.0/../../../../arm-linux-gnueabi/bin/ld: /home/XXXX/workspace/compiler/gcc/build/arm-linux-glibc/arm_linux_glibc_build_dir/obj/build-glibc/libc.a(dl-reloc-static-pie.o): in function elf_machine_rel': /home/XXXX/workspace/compiler/gcc/open_source/arm-linux-glibc-build_src/glibc-2.34/elf/../sysdeps/arm/dl-machine.h:440: undefined reference to _DYNAMIC'
/home/XXXX/workspace/compiler/gcc/build/arm-linux-glibc/arm_linux_glibc_build_dir/arm-linux-glibc/lib/gcc/arm-linux-gnueabi/10.3.0/../../../../arm-linux-gnueabi/bin/ld: /home/XXXX/workspace/compiler/gcc/open_source/arm-linux-glibc-build_src/glibc-2.34/elf/../sysdeps/arm/dl-machine.h:440: undefined reference to _DYNAMIC'


-----邮件原件-----
发件人: Szabolcs Nagy <szabolcs.nagy@arm.com> 
发送时间: 2022年12月5日 22:55
收件人: linzhuorong <linzhuorong@huawei.com>
抄送: libc-alpha@sourceware.org; Nixiaoming <nixiaoming@huawei.com>; xiaojiangfeng <xiaojiangfeng@huawei.com>; douzhaolei <douzhaolei@huawei.com>; Wangbing(wangbing,RTOS/Poincare Lab) <wangbing6@huawei.com>; wangfangpeng (A) <wangfangpeng1@huawei.com>; Liuyang (Young,C) <young.liuyang@huawei.com>
主题: Re: [PATCH] aarch64: fix elf_machine_dynamic compile error [BZ #29835]

The 12/02/2022 11:59, linzhuorong via Libc-alpha wrote:
> elf_machine_dynamic compile error when compiling glibc with 
> --enable-static-pie option turned on, static executables do not have 
> symbol _DYNAMIC

glibc no longer has --enable-static-pie, instead it has --disable-default-pie .

static pie should have _DYNAMIC symbol since it has dynamic relocations (relative relocs), what is the binutils version?

maybe glibc should disable default pie if old binutils is detected.

> 
> Fixes: bca0f5cbc9257c13322b99e55235c4f21ba0bd82("aarch64: Make 
> elf_machine_{load_address,dynamic} robust [BZ #28203]")
> 
> Signed-off-by linzhuorong <linzhuorong@huawei.com>
> ---
>  sysdeps/aarch64/dl-machine.h | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/sysdeps/aarch64/dl-machine.h 
> b/sysdeps/aarch64/dl-machine.h index ae8b14425a..49b1d1ea0e 100644
> --- a/sysdeps/aarch64/dl-machine.h
> +++ b/sysdeps/aarch64/dl-machine.h
> @@ -53,8 +53,9 @@ elf_machine_load_address (void)  static inline 
> ElfW(Addr) __attribute__ ((unused))  elf_machine_dynamic (void)  {
> -  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
> -  return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
> +  /* Declaring this hidden ensures that a PC-relative reference is 
> + uesed.  */  extern const ElfW(Addr) _GLOBAL_OFFSET_TABLE_[] 
> + attribute_hidden;  return _GLOBAL_OFFSET_TABLE_[0];
>  }
>  
>  /* Set up the loaded object described by L so its unrelocated PLT
> --
> 2.12.3
>
  
Szabolcs Nagy Dec. 7, 2022, 9:14 a.m. UTC | #3
The 12/07/2022 08:34, linzhuorong wrote:
> disable-default-pie compile out different results
> 
> The problem is why --enable-static-pie works in 7.3.0, but compiles error in 10.3.0?

-static-pie support was added in gcc 8 so this likely works with
gcc 7 because the configure option is just ignored then (and the
static linked executables are not PIE)

there can be linker issues causing gcc 10 to fail so the binutils
version matters too, not just the gcc version. (on aarch64 you
need at least version 2.30)

the compiler target seems to be arm-linux-gnueabi which is not aarch64,
so an aarch64 patch won't fix the issue.


> 
> Error log:
> /home/XXXX/workspace/compiler/gcc/build/arm-linux-glibc/arm_linux_glibc_build_dir/arm-linux-glibc/lib/gcc/arm-linux-gnueabi/10.3.0/../../../../arm-linux-gnueabi/bin/ld: /home/XXXX/workspace/compiler/gcc/build/arm-linux-glibc/arm_linux_glibc_build_dir/obj/build-glibc/libc.a(dl-reloc-static-pie.o): in function elf_machine_rel': /home/XXXX/workspace/compiler/gcc/open_source/arm-linux-glibc-build_src/glibc-2.34/elf/../sysdeps/arm/dl-machine.h:440: undefined reference to _DYNAMIC'
> /home/XXXX/workspace/compiler/gcc/build/arm-linux-glibc/arm_linux_glibc_build_dir/arm-linux-glibc/lib/gcc/arm-linux-gnueabi/10.3.0/../../../../arm-linux-gnueabi/bin/ld: /home/XXXX/workspace/compiler/gcc/open_source/arm-linux-glibc-build_src/glibc-2.34/elf/../sysdeps/arm/dl-machine.h:440: undefined reference to _DYNAMIC'
> 
> 
> -----邮件原件-----
> 发件人: Szabolcs Nagy <szabolcs.nagy@arm.com> 
> 发送时间: 2022年12月5日 22:55
> 收件人: linzhuorong <linzhuorong@huawei.com>
> 抄送: libc-alpha@sourceware.org; Nixiaoming <nixiaoming@huawei.com>; xiaojiangfeng <xiaojiangfeng@huawei.com>; douzhaolei <douzhaolei@huawei.com>; Wangbing(wangbing,RTOS/Poincare Lab) <wangbing6@huawei.com>; wangfangpeng (A) <wangfangpeng1@huawei.com>; Liuyang (Young,C) <young.liuyang@huawei.com>
> 主题: Re: [PATCH] aarch64: fix elf_machine_dynamic compile error [BZ #29835]
> 
> The 12/02/2022 11:59, linzhuorong via Libc-alpha wrote:
> > elf_machine_dynamic compile error when compiling glibc with 
> > --enable-static-pie option turned on, static executables do not have 
> > symbol _DYNAMIC
> 
> glibc no longer has --enable-static-pie, instead it has --disable-default-pie .
> 
> static pie should have _DYNAMIC symbol since it has dynamic relocations (relative relocs), what is the binutils version?
> 
> maybe glibc should disable default pie if old binutils is detected.
> 
> > 
> > Fixes: bca0f5cbc9257c13322b99e55235c4f21ba0bd82("aarch64: Make 
> > elf_machine_{load_address,dynamic} robust [BZ #28203]")
> > 
> > Signed-off-by linzhuorong <linzhuorong@huawei.com>
> > ---
> >  sysdeps/aarch64/dl-machine.h | 5 +++--
> >  1 file changed, 3 insertions(+), 2 deletions(-)
> > 
> > diff --git a/sysdeps/aarch64/dl-machine.h 
> > b/sysdeps/aarch64/dl-machine.h index ae8b14425a..49b1d1ea0e 100644
> > --- a/sysdeps/aarch64/dl-machine.h
> > +++ b/sysdeps/aarch64/dl-machine.h
> > @@ -53,8 +53,9 @@ elf_machine_load_address (void)  static inline 
> > ElfW(Addr) __attribute__ ((unused))  elf_machine_dynamic (void)  {
> > -  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
> > -  return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
> > +  /* Declaring this hidden ensures that a PC-relative reference is 
> > + uesed.  */  extern const ElfW(Addr) _GLOBAL_OFFSET_TABLE_[] 
> > + attribute_hidden;  return _GLOBAL_OFFSET_TABLE_[0];
> >  }
> >  
> >  /* Set up the loaded object described by L so its unrelocated PLT
> > --
> > 2.12.3
> >
  
linzhuorong Dec. 7, 2022, 12:52 p.m. UTC | #4
The version of binutils is 2.38
Use gcc 7.3.0 just for testing, if there is no --static-pie, it may give ignore, I found only i386, arm, aarch64, loongarch use _DYNAMIC way to get, other are use GOT,
what if I only fix arm? 

-----邮件原件-----
发件人: Szabolcs Nagy <szabolcs.nagy@arm.com> 
发送时间: 2022年12月7日 17:14
收件人: linzhuorong <linzhuorong@huawei.com>
抄送: libc-alpha@sourceware.org; Nixiaoming <nixiaoming@huawei.com>; xiaojiangfeng <xiaojiangfeng@huawei.com>; douzhaolei <douzhaolei@huawei.com>; Wangbing(wangbing,RTOS/Poincare Lab) <wangbing6@huawei.com>; wangfangpeng (A) <wangfangpeng1@huawei.com>; Liuyang (Young,C) <young.liuyang@huawei.com>
主题: Re: 答复: [PATCH] aarch64: fix elf_machine_dynamic compile error [BZ #29835]

The 12/07/2022 08:34, linzhuorong wrote:
> disable-default-pie compile out different results
> 
> The problem is why --enable-static-pie works in 7.3.0, but compiles error in 10.3.0?

-static-pie support was added in gcc 8 so this likely works with gcc 7 because the configure option is just ignored then (and the static linked executables are not PIE)

there can be linker issues causing gcc 10 to fail so the binutils version matters too, not just the gcc version. (on aarch64 you need at least version 2.30)

the compiler target seems to be arm-linux-gnueabi which is not aarch64, so an aarch64 patch won't fix the issue.


> 
> Error log:
> /home/XXXX/workspace/compiler/gcc/build/arm-linux-glibc/arm_linux_glibc_build_dir/arm-linux-glibc/lib/gcc/arm-linux-gnueabi/10.3.0/../../../../arm-linux-gnueabi/bin/ld: /home/XXXX/workspace/compiler/gcc/build/arm-linux-glibc/arm_linux_glibc_build_dir/obj/build-glibc/libc.a(dl-reloc-static-pie.o): in function elf_machine_rel': /home/XXXX/workspace/compiler/gcc/open_source/arm-linux-glibc-build_src/glibc-2.34/elf/../sysdeps/arm/dl-machine.h:440: undefined reference to _DYNAMIC'
> /home/XXXX/workspace/compiler/gcc/build/arm-linux-glibc/arm_linux_glibc_build_dir/arm-linux-glibc/lib/gcc/arm-linux-gnueabi/10.3.0/../../../../arm-linux-gnueabi/bin/ld: /home/XXXX/workspace/compiler/gcc/open_source/arm-linux-glibc-build_src/glibc-2.34/elf/../sysdeps/arm/dl-machine.h:440: undefined reference to _DYNAMIC'
> 
> 
> -----邮件原件-----
> 发件人: Szabolcs Nagy <szabolcs.nagy@arm.com>
> 发送时间: 2022年12月5日 22:55
> 收件人: linzhuorong <linzhuorong@huawei.com>
> 抄送: libc-alpha@sourceware.org; Nixiaoming <nixiaoming@huawei.com>; 
> xiaojiangfeng <xiaojiangfeng@huawei.com>; douzhaolei 
> <douzhaolei@huawei.com>; Wangbing(wangbing,RTOS/Poincare Lab) 
> <wangbing6@huawei.com>; wangfangpeng (A) <wangfangpeng1@huawei.com>; 
> Liuyang (Young,C) <young.liuyang@huawei.com>
> 主题: Re: [PATCH] aarch64: fix elf_machine_dynamic compile error [BZ 
> #29835]
> 
> The 12/02/2022 11:59, linzhuorong via Libc-alpha wrote:
> > elf_machine_dynamic compile error when compiling glibc with 
> > --enable-static-pie option turned on, static executables do not have 
> > symbol _DYNAMIC
> 
> glibc no longer has --enable-static-pie, instead it has --disable-default-pie .
> 
> static pie should have _DYNAMIC symbol since it has dynamic relocations (relative relocs), what is the binutils version?
> 
> maybe glibc should disable default pie if old binutils is detected.
> 
> > 
> > Fixes: bca0f5cbc9257c13322b99e55235c4f21ba0bd82("aarch64: Make 
> > elf_machine_{load_address,dynamic} robust [BZ #28203]")
> > 
> > Signed-off-by linzhuorong <linzhuorong@huawei.com>
> > ---
> >  sysdeps/aarch64/dl-machine.h | 5 +++--
> >  1 file changed, 3 insertions(+), 2 deletions(-)
> > 
> > diff --git a/sysdeps/aarch64/dl-machine.h 
> > b/sysdeps/aarch64/dl-machine.h index ae8b14425a..49b1d1ea0e 100644
> > --- a/sysdeps/aarch64/dl-machine.h
> > +++ b/sysdeps/aarch64/dl-machine.h
> > @@ -53,8 +53,9 @@ elf_machine_load_address (void)  static inline
> > ElfW(Addr) __attribute__ ((unused))  elf_machine_dynamic (void)  {
> > -  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
> > -  return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
> > +  /* Declaring this hidden ensures that a PC-relative reference is 
> > + uesed.  */  extern const ElfW(Addr) _GLOBAL_OFFSET_TABLE_[] 
> > + attribute_hidden;  return _GLOBAL_OFFSET_TABLE_[0];
> >  }
> >  
> >  /* Set up the loaded object described by L so its unrelocated PLT
> > --
> > 2.12.3
> >
  
Szabolcs Nagy Dec. 8, 2022, 9:26 a.m. UTC | #5
The 12/07/2022 12:52, linzhuorong wrote:
> The version of binutils is 2.38
> Use gcc 7.3.0 just for testing, if there is no --static-pie, it may give ignore, I found only i386, arm, aarch64, loongarch use _DYNAMIC way to get, other are use GOT,
> what if I only fix arm? 

what is the issue you want to fix?

so far we haven't seen any.

you just misconfigure the glibc build.

> 
> -----邮件原件-----
> 发件人: Szabolcs Nagy <szabolcs.nagy@arm.com> 
> 发送时间: 2022年12月7日 17:14
> 收件人: linzhuorong <linzhuorong@huawei.com>
> 抄送: libc-alpha@sourceware.org; Nixiaoming <nixiaoming@huawei.com>; xiaojiangfeng <xiaojiangfeng@huawei.com>; douzhaolei <douzhaolei@huawei.com>; Wangbing(wangbing,RTOS/Poincare Lab) <wangbing6@huawei.com>; wangfangpeng (A) <wangfangpeng1@huawei.com>; Liuyang (Young,C) <young.liuyang@huawei.com>
> 主题: Re: 答复: [PATCH] aarch64: fix elf_machine_dynamic compile error [BZ #29835]
> 
> The 12/07/2022 08:34, linzhuorong wrote:
> > disable-default-pie compile out different results
> > 
> > The problem is why --enable-static-pie works in 7.3.0, but compiles error in 10.3.0?
> 
> -static-pie support was added in gcc 8 so this likely works with gcc 7 because the configure option is just ignored then (and the static linked executables are not PIE)
> 
> there can be linker issues causing gcc 10 to fail so the binutils version matters too, not just the gcc version. (on aarch64 you need at least version 2.30)
> 
> the compiler target seems to be arm-linux-gnueabi which is not aarch64, so an aarch64 patch won't fix the issue.
> 
> 
> > 
> > Error log:
> > /home/XXXX/workspace/compiler/gcc/build/arm-linux-glibc/arm_linux_glibc_build_dir/arm-linux-glibc/lib/gcc/arm-linux-gnueabi/10.3.0/../../../../arm-linux-gnueabi/bin/ld: /home/XXXX/workspace/compiler/gcc/build/arm-linux-glibc/arm_linux_glibc_build_dir/obj/build-glibc/libc.a(dl-reloc-static-pie.o): in function elf_machine_rel': /home/XXXX/workspace/compiler/gcc/open_source/arm-linux-glibc-build_src/glibc-2.34/elf/../sysdeps/arm/dl-machine.h:440: undefined reference to _DYNAMIC'
> > /home/XXXX/workspace/compiler/gcc/build/arm-linux-glibc/arm_linux_glibc_build_dir/arm-linux-glibc/lib/gcc/arm-linux-gnueabi/10.3.0/../../../../arm-linux-gnueabi/bin/ld: /home/XXXX/workspace/compiler/gcc/open_source/arm-linux-glibc-build_src/glibc-2.34/elf/../sysdeps/arm/dl-machine.h:440: undefined reference to _DYNAMIC'
> > 
> > 
> > -----邮件原件-----
> > 发件人: Szabolcs Nagy <szabolcs.nagy@arm.com>
> > 发送时间: 2022年12月5日 22:55
> > 收件人: linzhuorong <linzhuorong@huawei.com>
> > 抄送: libc-alpha@sourceware.org; Nixiaoming <nixiaoming@huawei.com>; 
> > xiaojiangfeng <xiaojiangfeng@huawei.com>; douzhaolei 
> > <douzhaolei@huawei.com>; Wangbing(wangbing,RTOS/Poincare Lab) 
> > <wangbing6@huawei.com>; wangfangpeng (A) <wangfangpeng1@huawei.com>; 
> > Liuyang (Young,C) <young.liuyang@huawei.com>
> > 主题: Re: [PATCH] aarch64: fix elf_machine_dynamic compile error [BZ 
> > #29835]
> > 
> > The 12/02/2022 11:59, linzhuorong via Libc-alpha wrote:
> > > elf_machine_dynamic compile error when compiling glibc with 
> > > --enable-static-pie option turned on, static executables do not have 
> > > symbol _DYNAMIC
> > 
> > glibc no longer has --enable-static-pie, instead it has --disable-default-pie .
> > 
> > static pie should have _DYNAMIC symbol since it has dynamic relocations (relative relocs), what is the binutils version?
> > 
> > maybe glibc should disable default pie if old binutils is detected.
> > 
> > > 
> > > Fixes: bca0f5cbc9257c13322b99e55235c4f21ba0bd82("aarch64: Make 
> > > elf_machine_{load_address,dynamic} robust [BZ #28203]")
> > > 
> > > Signed-off-by linzhuorong <linzhuorong@huawei.com>
> > > ---
> > >  sysdeps/aarch64/dl-machine.h | 5 +++--
> > >  1 file changed, 3 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/sysdeps/aarch64/dl-machine.h 
> > > b/sysdeps/aarch64/dl-machine.h index ae8b14425a..49b1d1ea0e 100644
> > > --- a/sysdeps/aarch64/dl-machine.h
> > > +++ b/sysdeps/aarch64/dl-machine.h
> > > @@ -53,8 +53,9 @@ elf_machine_load_address (void)  static inline
> > > ElfW(Addr) __attribute__ ((unused))  elf_machine_dynamic (void)  {
> > > -  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
> > > -  return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
> > > +  /* Declaring this hidden ensures that a PC-relative reference is 
> > > + uesed.  */  extern const ElfW(Addr) _GLOBAL_OFFSET_TABLE_[] 
> > > + attribute_hidden;  return _GLOBAL_OFFSET_TABLE_[0];
> > >  }
> > >  
> > >  /* Set up the loaded object described by L so its unrelocated PLT
> > > --
> > > 2.12.3
> > >
  

Patch

diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
index ae8b14425a..49b1d1ea0e 100644
--- a/sysdeps/aarch64/dl-machine.h
+++ b/sysdeps/aarch64/dl-machine.h
@@ -53,8 +53,9 @@  elf_machine_load_address (void)
 static inline ElfW(Addr) __attribute__ ((unused))
 elf_machine_dynamic (void)
 {
-  extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
-  return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
+  /* Declaring this hidden ensures that a PC-relative reference is uesed.  */
+  extern const ElfW(Addr) _GLOBAL_OFFSET_TABLE_[] attribute_hidden;
+  return _GLOBAL_OFFSET_TABLE_[0];
 }
 
 /* Set up the loaded object described by L so its unrelocated PLT