[Bug 1568899] Re: ld: a.out: hidden symbol `__cpu_model' in /usr/lib/gcc/x86_64-linux-gnu/5/libgcc.a(cpuinfo.o) is referenced by DSO

Bug Watch Updater 1568899 at bugs.launchpad.net
Wed Jan 16 18:12:20 UTC 2019


Launchpad has imported 9 comments from the remote bug at
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65612.

If you reply to an imported comment from within Launchpad, your comment
will be sent to the remote bug automatically. Read more about
Launchpad's inter-bugtracker facilities at
https://help.launchpad.net/InterBugTracking.

------------------------------------------------------------------------
On 2015-03-27T18:26:08+00:00 Hjl-tools wrote:

On Linux/x86, r221732 gave

FAIL: g++.dg/ext/mv14.C  -std=gnu++11 execution test
FAIL: g++.dg/ext/mv14.C  -std=gnu++14 execution test
FAIL: g++.dg/ext/mv14.C  -std=gnu++98 execution test
FAIL: g++.dg/ext/mv15.C  -std=gnu++11 execution test
FAIL: g++.dg/ext/mv15.C  -std=gnu++14 execution test
FAIL: g++.dg/ext/mv15.C  -std=gnu++98 execution test
FAIL: g++.dg/ext/mv1.C  -std=gnu++11 execution test
FAIL: g++.dg/ext/mv1.C  -std=gnu++14 execution test
FAIL: g++.dg/ext/mv1.C  -std=gnu++98 execution test

when compiled with -fPIE -pie.

Reply at:
https://bugs.launchpad.net/ubuntu/+source/gcc-5/+bug/1568899/comments/0

------------------------------------------------------------------------
On 2015-03-29T19:29:53+00:00 Ubizjak wrote:

I don't think the compiler is at fault here.

Tracing the executable, I got:

Breakpoint 1, 0x0000555555554780 in __cpu_indicator_init at plt ()
(gdb) disass
Dump of assembler code for function __cpu_indicator_init at plt:
=> 0x0000555555554780 <+0>:     jmpq   *0x2018ba(%rip)        # 0x555555756040 <__cpu_indicator_init at got.plt>
   0x0000555555554786 <+6>:     pushq  $0x4
   0x000055555555478b <+11>:    jmpq   0x555555554720
End of assembler dump.
(gdb) p/x *0x555555756040
$1 = 0x786

(gdb) si
0x0000000000000786 in ?? ()

Some kind of fixup is missing for __cpu_indicator_init at got.plt value.

Reply at:
https://bugs.launchpad.net/ubuntu/+source/gcc-5/+bug/1568899/comments/1

------------------------------------------------------------------------
On 2015-03-29T19:57:51+00:00 Hjl-tools wrote:

(gdb) bt
#0  0x0000000000000706 in ?? ()
#1  0x0000555555554b69 in foo ()
    at /export/gnu/import/git/gcc/gcc/testsuite/g++.dg/ext/mv1.C:32
#2  0x00007ffff7de76b8 in _dl_relocate_object ()
   from /lib64/ld-linux-x86-64.so.2
#3  0x00007ffff7ddea4a in dl_main () from /lib64/ld-linux-x86-64.so.2
#4  0x00007ffff7df28d5 in _dl_sysdep_start () from /lib64/ld-linux-x86-64.so.2
#5  0x00007ffff7ddfce1 in _dl_start () from /lib64/ld-linux-x86-64.so.2
#6  0x00007ffff7ddbcd8 in _start () from /lib64/ld-linux-x86-64.so.2
#7  0x0000000000000001 in ?? ()
#8  0x00007fffffffe18d in ?? ()
#9  0x0000000000000000 in ?? ()
(gdb) f 1
#1  0x0000555555554b69 in foo ()
    at /export/gnu/import/git/gcc/gcc/testsuite/g++.dg/ext/mv1.C:32
32	int (*p)() = &foo;
(gdb) disass
Dump of assembler code for function _Z3foov.resolver(void):
   0x0000555555554b60 <+0>:	sub    $0x8,%rsp
   0x0000555555554b64 <+4>:	callq  0x555555554700 <__cpu_indicator_init at plt>
=> 0x0000555555554b69 <+9>:	mov    0x200740(%rip),%rsi        # 0x5555557552b0
   0x0000555555554b70 <+16>:	mov    0xc(%rsi),%edx
   0x0000555555554b73 <+19>:	mov    %edx,%eax
   0x0000555555554b75 <+21>:	mov    %edx,%ecx
   0x0000555555554b77 <+23>:	and    $0x400,%eax
   0x0000555555554b7c <+28>:	and    $0x40,%ecx
   0x0000555555554b7f <+31>:	cmp    %ecx,%eax
   0x0000555555554b81 <+33>:	cmovg  %ecx,%eax
   0x0000555555554b84 <+36>:	test   %eax,%eax
   0x0000555555554b86 <+38>:	jle    0x555555554b98 <_Z3foov.resolver(void)+56>
   0x0000555555554b88 <+40>:	lea    -0xbf(%rip),%rax        # 0x555555554ad0 <_Z3foov.avx2_ssse3>
   0x0000555555554b8f <+47>:	add    $0x8,%rsp
   0x0000555555554b93 <+51>:	retq   
   0x0000555555554b94 <+52>:	nopl   0x0(%rax)
   0x0000555555554b98 <+56>:	cmpl   $0x8,0x8(%rsi)
   0x0000555555554b9c <+60>:	jne    0x555555554bb0 <_Z3foov.resolver(void)+80---Type <return> to continue, or q <return> to quit---q
Quit
(gdb) disass 0x0000555555554700,+16
Dump of assembler code from 0x555555554700 to 0x555555554710:
   0x0000555555554700 <__cpu_indicator_init at plt+0>:	jmpq   *0x200be2(%rip)        # 0x5555557552e8 <__cpu_indicator_init at got.plt>
   0x0000555555554706 <__cpu_indicator_init at plt+6>:	pushq  $0x2
   0x000055555555470b <__cpu_indicator_init at plt+11>:	jmpq   0x5555555546c0
End of assembler dump.
(gdb) 

We can't call __cpu_indicator_init in PIE while PIE is being relocated.
Its .got.plt section hasn't been updated.  It works for non-PIE since
no update on .got.plt section is required.  Can we move __cpu_indicator_init
to main executable?

Reply at:
https://bugs.launchpad.net/ubuntu/+source/gcc-5/+bug/1568899/comments/2

------------------------------------------------------------------------
On 2015-03-29T20:11:58+00:00 Hjl-tools wrote:

Created attachment 35173
A patch to move __cpu_indicator_init

This patch is incomplete.  We need to handle backward compatibility
as well as versioned functions in shared library.

Reply at:
https://bugs.launchpad.net/ubuntu/+source/gcc-5/+bug/1568899/comments/3

------------------------------------------------------------------------
On 2015-03-29T20:51:36+00:00 Hjl-tools wrote:

Created attachment 35175
A patch to add __cpu_indicator_init to libgcc.a

This patch adds _cpu_indicator_init to libgcc.a and hides
it from linker with backward binary compatibility.

Reply at:
https://bugs.launchpad.net/ubuntu/+source/gcc-5/+bug/1568899/comments/4

------------------------------------------------------------------------
On 2015-03-30T02:24:16+00:00 Hjl-tools wrote:

Created attachment 35176
A testcase with DSO

[hjl at gnu-tools-1 pr65612]$ make
g++ -O2    -c -o main.o main.cc
g++ -shared -fPIC -O2  -o libmv20.so mv20.cc
g++ -O2  -o x main.o libmv20.so -Wl,-R,.
./x
Makefile:8: recipe for target 'all' failed
make: *** [all] Segmentation fault (core dumped)
[hjl at gnu-tools-1 pr65612]$

Reply at:
https://bugs.launchpad.net/ubuntu/+source/gcc-5/+bug/1568899/comments/5

------------------------------------------------------------------------
On 2015-03-30T22:35:34+00:00 Hjl-tools wrote:

A patch is posted at

https://gcc.gnu.org/ml/gcc-patches/2015-03/msg01598.html

Reply at:
https://bugs.launchpad.net/ubuntu/+source/gcc-5/+bug/1568899/comments/6

------------------------------------------------------------------------
On 2015-04-17T12:58:39+00:00 Hjl-0 wrote:

Author: hjl
Date: Fri Apr 17 12:58:07 2015
New Revision: 222178

URL: https://gcc.gnu.org/viewcvs?rev=222178&root=gcc&view=rev
Log:
Hide __cpu_indicator_init/__cpu_model from linker

We shouldn't call external function, __cpu_indicator_init, while an object
is being relocated since its .got.plt section hasn't been updated.  It
works for non-PIE since no update on .got.plt section is required.  This
patch creates libgcc.so as a linker script, hides __cpu_indicator_init
and __cpu_model in libgcc.so.1 from linker, forces linker to resolve
__cpu_indicator_init and __cpu_model to their hidden definitions in
libgcc.a while providing backward binary compatibility.

gcc/testsuite/

	PR target/65612
	* g++.dg/ext/mv18.C: New test.
	* g++.dg/ext/mv19.C: Likewise.
	* g++.dg/ext/mv20.C: Likewise.
	* g++.dg/ext/mv21.C: Likewise.
	* g++.dg/ext/mv22.C: Likewise.
	* g++.dg/ext/mv23.C: Likewise.

libgcc/

	PR target/65612
	* config.host (tmake_file): Add t-slibgcc-libgcc for Linux/x86.
	* config/i386/cpuinfo.c (__cpu_model): Initialize.
	(__cpu_indicator_init at GCC_4.8.0): New.
	(__cpu_model at GCC_4.8.0): Likewise.
	* config/i386/t-linux (HOST_LIBGCC2_CFLAGS): Add
	-DUSE_ELF_SYMVER.

Added:
    trunk/gcc/testsuite/g++.dg/ext/mv18.C
    trunk/gcc/testsuite/g++.dg/ext/mv19.C
    trunk/gcc/testsuite/g++.dg/ext/mv20.C
    trunk/gcc/testsuite/g++.dg/ext/mv21.C
    trunk/gcc/testsuite/g++.dg/ext/mv22.C
    trunk/gcc/testsuite/g++.dg/ext/mv23.C
Modified:
    trunk/gcc/testsuite/ChangeLog
    trunk/libgcc/ChangeLog
    trunk/libgcc/config.host
    trunk/libgcc/config/i386/cpuinfo.c
    trunk/libgcc/config/i386/t-linux

Reply at:
https://bugs.launchpad.net/ubuntu/+source/gcc-5/+bug/1568899/comments/7

------------------------------------------------------------------------
On 2015-04-17T13:37:16+00:00 Hjl-tools wrote:

Fixed for 6.0.

Reply at:
https://bugs.launchpad.net/ubuntu/+source/gcc-5/+bug/1568899/comments/8


** Changed in: gcc
       Status: Unknown => Fix Released

** Changed in: gcc
   Importance: Unknown => Medium

-- 
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to gcc-5 in Ubuntu.
https://bugs.launchpad.net/bugs/1568899

Title:
  ld: a.out: hidden symbol `__cpu_model' in /usr/lib/gcc/x86_64-linux-
  gnu/5/libgcc.a(cpuinfo.o) is referenced by DSO

Status in gcc:
  Fix Released
Status in gcc-5 package in Ubuntu:
  Confirmed

Bug description:
  On Ubuntu 16.04 beta 2, there is a regression in
  g++ 4:5.3.1-1ubuntu1
  g++ (Ubuntu 5.3.1-13ubuntu3) 5.3.1 20160330
  relative to Ubuntu 15.10 and before.
  This came to light while compiling an app that uses stb_image.h, see
  https://github.com/nothings/stb/issues/280

  In 
  https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/ZM2L65WIZEEQHHLFERZYD5FAG7QY2OGB/
  Jakub Jelinek suggested a workaround (add  -lgcc_s -lgcc at the end of the g++ command that links the shared library)
  and a real fix 
  "on ppc32 I remember libgcc_s.so is a linker script which links in -lgcc_s -lgcc, perhaps we need it on x86_64/i686 too".
  His workaround helped me.
  I don't know if a gcc has been filed yet; I couldn't find one, but at least Jakub is aware of the problem.

  To reproduce, use __builtin_cpu_supports from a shared library, and link with g++.
  Example:

  ::::::::::::::
  bugapp.c
  ::::::::::::::
  #include <stdio.h>
  extern int foo();

  int main(int argc, char **argv) {
      printf("foo is %d\n", foo());
  }
  ::::::::::::::
  buglib.c
  ::::::::::::::
  int foo(void) {
      return __builtin_cpu_supports("sse2");
  }
  ::::::::::::::
  bug.sh
  ::::::::::::::
  #!/bin/sh
  set -x
  echo Demonstrate gotcha in __builtin_cpu_supports on Ubuntu 16.04 and rawhide / f24 
  echo See https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/ZM2L65WIZEEQHHLFERZYD5FAG7QY2OGB/
  echo Maybe caused by https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61309

  echo Linking with gcc works:
  gcc -fPIC -shared  buglib.c -o buglib.so
  gcc bugapp.c buglib.so

  echo Linking with g++ fails:
  g++ -fPIC -shared  buglib.c -o buglib.so
  g++ bugapp.c buglib.so
  # /usr/bin/ld: a.out: hidden symbol `__cpu_model' in /usr/lib/gcc/x86_64-linux-gnu/5/libgcc.a(cpuinfo.o) is referenced by DSO
  # /usr/bin/ld: final link failed: Bad value
  # collect2: error: ld returned 1 exit status
  g++ --version

  echo Rescue by linking libgcc explicitly into shared library:
  g++ -fPIC -shared  buglib.c -lgcc_s -lgcc -o buglib.so
  g++ bugapp.c buglib.so

To manage notifications about this bug go to:
https://bugs.launchpad.net/gcc/+bug/1568899/+subscriptions



More information about the foundations-bugs mailing list