llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
29.25k stars 12.08k forks source link

r369233 breaks linking of packages in Chrome OS #42437

Closed m-gupta closed 4 months ago

m-gupta commented 5 years ago
Bugzilla Link 43092
Version unspecified
OS Linux
CC @gburgessiv,@MaskRay,@lalozano,@m-gupta

Extended Description

Post r369233: [MC] Don't emit .symver redirected symbols to the symbol table (https://reviews.llvm.org/rL369233), some packages in Chrome OS fail to link with gold linker.

https://ci.chromium.org/p/chromeos/builders/general/Try/b8904712082539323888

Some error logs:

alsa-lib-1.1.6-r3: libtool: link: armv7a-cros-linux-gnueabihf-clang -shared  -fPIC -DPIC  .libs/conf.o .libs/confmisc.o .libs/input.o .libs/output.o .libs/async.o .libs/error.o .libs/dlmisc.o .libs/socket.o .libs/shmarea.o .libs/userfile.o .libs/names.o  -Wl,--whole-archive control/.libs/libcontrol.a mixer/.libs/libmixer.a pcm/.libs/libpcm.a timer/.libs/libtimer.a rawmidi/.libs/librawmidi.a hwdep/.libs/libhwdep.a seq/.libs/libseq.a ucm/.libs/libucm.a topology/.libs/libtopology.a -Wl,--no-whole-archive  -Wl,--as-needed -lm -ldl -lpthread -lrt  -O2 -march=armv8-a+crc -mtune=cortex-a57.cortex-a53 -mfpu=crypto-neon-fp-armv8 -mfloat-abi=hard -g -Wl,--version-script=Versions -Wl,--no-undefined -Wl,-O2   -Wl,-soname -Wl,libasound.so.2 -o .libs/libasound.so.2.0.0
alsa-lib-1.1.6-r3: ../../../alsa-lib-1.1.6/src/mixer/simple_abst.c:130: error: undefined reference to '__snd_dlopen'
alsa-lib-1.1.6-r3: ../../../alsa-lib-1.1.6/src/pcm/pcm_params.c:2335: error: undefined reference to '__snd_pcm_hw_params_get_access'
alsa-lib-1.1.6-r3: ../../../alsa-lib-1.1.6/src/pcm/pcm_params.c:2336: error: undefined reference to '__snd_pcm_hw_params_get_format'

fuse-common-3.2.6-r2: [44/64] armv7a-cros-linux-gnueabihf-clang  -o lib/libfuse3.so.3.2.6 'lib/76b5a35@@fuse3@sha/fuse.c.o' 'lib/76b5a35@@fuse3@sha/fuse_loop.c.o' 'lib/76b5a35@@fuse3@sha/fuse_loop_mt.c.o' 'lib/76b5a35@@fuse3@sha/fuse_lowlevel.c.o' 'lib/76b5a35@@fuse3@sha/fuse_opt.c.o' 'lib/76b5a35@@fuse3@sha/fuse_signals.c.o' 'lib/76b5a35@@fuse3@sha/buffer.c.o' 'lib/76b5a35@@fuse3@sha/cuse_lowlevel.c.o' 'lib/76b5a35@@fuse3@sha/helper.c.o' 'lib/76b5a35@@fuse3@sha/modules_subdir.c.o' 'lib/76b5a35@@fuse3@sha/mount.c.o' 'lib/76b5a35@@fuse3@sha/mount_util.c.o' 'lib/76b5a35@@fuse3@sha/modules_iconv.c.o' -Wl,--no-undefined -Wl,--as-needed -shared -fPIC -Wl,--start-group -Wl,-soname,libfuse3.so.3 -Wl,--version-script,/build/kevin/tmp/portage/sys-fs/fuse-common-3.2.6-r2/work/fuse-3.2.6/lib/fuse_versionscript -ldl -lrt -Wl,--end-group -pthread -O2 -pipe -march=armv8-a+crc -mtune=cortex-a57.cortex-a53 -mfpu=crypto-neon-fp-armv8 -mfloat-abi=hard -g -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -Wl,-O2 -Wl,--as-needed 
fuse-common-3.2.6-r2: FAILED: lib/libfuse3.so.3.2.6 
fuse-common-3.2.6-r2: armv7a-cros-linux-gnueabihf-clang  -o lib/libfuse3.so.3.2.6 'lib/76b5a35@@fuse3@sha/fuse.c.o' 'lib/76b5a35@@fuse3@sha/fuse_loop.c.o' 'lib/76b5a35@@fuse3@sha/fuse_loop_mt.c.o' 'lib/76b5a35@@fuse3@sha/fuse_lowlevel.c.o' 'lib/76b5a35@@fuse3@sha/fuse_opt.c.o' 'lib/76b5a35@@fuse3@sha/fuse_signals.c.o' 'lib/76b5a35@@fuse3@sha/buffer.c.o' 'lib/76b5a35@@fuse3@sha/cuse_lowlevel.c.o' 'lib/76b5a35@@fuse3@sha/helper.c.o' 'lib/76b5a35@@fuse3@sha/modules_subdir.c.o' 'lib/76b5a35@@fuse3@sha/mount.c.o' 'lib/76b5a35@@fuse3@sha/mount_util.c.o' 'lib/76b5a35@@fuse3@sha/modules_iconv.c.o' -Wl,--no-undefined -Wl,--as-needed -shared -fPIC -Wl,--start-group -Wl,-soname,libfuse3.so.3 -Wl,--version-script,/build/kevin/tmp/portage/sys-fs/fuse-common-3.2.6-r2/work/fuse-3.2.6/lib/fuse_versionscript -ldl -lrt -Wl,--end-group -pthread -O2 -pipe -march=armv8-a+crc -mtune=cortex-a57.cortex-a53 -mfpu=crypto-neon-fp-armv8 -mfloat-abi=hard -g -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -Wl,-O2 -Wl,--as-needed 
fuse-common-3.2.6-r2: ../fuse-3.2.6/lib/cuse_lowlevel.c:356: error: undefined reference to 'fuse_session_loop_mt_32'
fuse-common-3.2.6-r2: ../fuse-3.2.6/lib/helper.c:311: error: undefined reference to 'fuse_new_31'
fuse-common-3.2.6-r2: ../fuse-3.2.6/lib/helper.c:339: error: undefined reference to 'fuse_loop_mt_32'

The working build logs with source files/old objects are at https://drive.google.com/drive/folders/1qD5uxkiCHCsh3GJG9M7ADCzHekaUkyrk?usp=sharing

MaskRay commented 5 years ago

Sorry for the trouble I caused. This is related to a nasty .symver issue involving the assembler the linker. As the description said:

  In lld, if it sees f and f@v1:

      --version-script =(printf 'v1 {};') => f and f@v1
      --version-script =(printf 'v1 { f; };') => f@v1 and f@@v1

It can be argued that @@@ added on 2000-11-13 corrected the @ and @@ mistake.

I hope we can handle .symver in a clean way (not an indirect symbol as used in GNU ld).

Eventually I hope .symver @ and @@ can be a rename as @@@ does. The way fuse and alsa-lib use .symver may be less than ideal. Let me check if fuse and alsa-lib can be patched.

m-gupta commented 5 years ago

Reverted in r369790

m-gupta commented 5 years ago

Easier repro:

$ git clone https://github.com/libfuse/libfuse.git
$ mkdir libfuse/build && cd libfuse/build
$ CC=/path/to/clang CXX=/path/to/clang++ meson ..

Linker will error out with same errors:

clang  -o lib/libfuse3.so.3.6.2 'lib/76b5a35@@fuse3@sha/fuse.c.o' 'lib/76b5a35@@fuse3@sha/fuse_loop.c.o' 'lib/76b5a35@@fuse3@sha/fuse_loop_mt.c.o' 'lib/76b5a35@@fuse3@sha/fuse_lowlevel.c.o' 'lib/76b5a35@@fuse3@sha/fuse_opt.c.o' 'lib/76b5a35@@fuse3@sha/fuse_signals.c.o' 'lib/76b5a35@@fuse3@sha/buffer.c.o' 'lib/76b5a35@@fuse3@sha/cuse_lowlevel.c.o' 'lib/76b5a35@@fuse3@sha/helper.c.o' 'lib/76b5a35@@fuse3@sha/modules_subdir.c.o' 'lib/76b5a35@@fuse3@sha/mount_util.c.o' 'lib/76b5a35@@fuse3@sha/mount.c.o' 'lib/76b5a35@@fuse3@sha/modules_iconv.c.o' -Wl,--no-undefined -Wl,--as-needed -shared -fPIC -Wl,--start-group -Wl,-soname,libfuse3.so.3 -Wl,--version-script,build/libfuse/lib/fuse_versionscript -ldl -lrt -Wl,--end-group -pthread  

../lib/fuse.c:4538: error: undefined reference to 'fuse_session_loop_mt_32'
../lib/cuse_lowlevel.c:356: error: undefined reference to 'fuse_session_loop_mt_32'
../lib/helper.c:316: error: undefined reference to 'fuse_new_31'
../lib/helper.c:344: error: undefined reference to 'fuse_loop_mt_32'