HomePhabricator

[MC] Don't emit .symver redirected symbols to the symbol table
Audit RequiredrL369233

Description

[MC] Don't emit .symver redirected symbols to the symbol table

GNU as keeps the original symbol in the symbol table for defined @ and
@@, but suppresses it in other cases (@@@ or undefined). The original
symbol is usually undesired:
In a shared object, the original symbol can be localized with a version
script, but it is hard to remove/localize in an archive:

  1. a post-processing step removes the undesired original symbol
  2. consumers (executable) of the archive are built with the version script

Moreover, it can cause linker issues like binutils PR/18703 if the
original symbol name and the base name of the versioned symbol is the
same (both ld.bfd and gold have some code to work around defined @ and
@@). 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.

This patch catches some more multiple version errors (defined @ and @@),
and consistently suppress the original symbol. This addresses all the
problems listed above.

If the user wants other aliases to the versioned symbol, they can copy
the original symbol to other symbol names with .set directive, e.g.

.symver f, f@v1  # emit f@v1 but not f into .symtab
.set f_impl, f   # emit f_impl into .symtab

Details

Auditors
grosbach
Committed
MaskRayAug 18 2019, 11:17 PM
Parents
rL369232: [X86] Teach lower1BitShuffle to match right shifts with upper zero elements on…
Branches
Unknown
Tags
Unknown

Event Timeline

This commit now requires audit.Aug 18 2019, 11:16 PM

Hi Fangrui,

We suspect that we are hitting Linking failures after this CL in Chrome OS with some packages on both ARM32/X86_64.

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'

We can send you more details if you want.