[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
-export-symbols-regex seems to produce wrong version maps
From: |
Jan Engelhardt |
Subject: |
-export-symbols-regex seems to produce wrong version maps |
Date: |
Sun, 16 Feb 2014 13:26:16 +0100 (CET) |
User-agent: |
Alpine 2.11 (LSU 23 2013-08-11) |
When -export-symbols-regex is passed to libtool (for example
in the systems source), it generates a version map that gold
does not like:
$ make
make --no-print-directory all-recursive
Making all in .
/bin/sh ./libtool --tag=CC --mode=link gcc-4.9 -std=gnu99 -pipe -Wall
-Wextra -Wno-inline -Wundef -Wformat=2 -Wformat-security -Wformat-nonliteral
-Wlogical-op -Wsign-compare -Wmissing-include-dirs -Wold-style-definition
-Wpointer-arith -Winit-self -Wdeclaration-after-statement -Wfloat-equal
-Wsuggest-attribute=noreturn -Wmissing-prototypes -Wstrict-prototypes
-Wredundant-decls -Wmissing-declarations -Wmissing-noreturn -Wshadow
-Wendif-labels -Wcast-align -Wstrict-aliasing=2 -Wwrite-strings -Wno-long-long
-Wno-overlength-strings -Wno-unused-parameter -Wno-missing-field-initializers
-Wno-unused-result -Werror=overflow -Wdate-time -Wnested-externs -ffast-math
-fno-common -fdiagnostics-show-option -fdiagnostics-color -fno-strict-aliasing
-fvisibility=hidden -ffunction-sections -fdata-sections -fstack-protector
--param=ssp-buffer-size=4 -flto -fvisibility=default -pthread
-I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -g -O2 -Wl,--as-needed
-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,relro -Wl,-z,now -Wl,-fuse-ld=gold
-version-info 1:3:1 -export-dynamic -no-undefined -export-symbols-regex
'^g_udev_.*' -o libgudev-1.0.la -rpath /usr/lib
src/gudev/libgudev_1_0_la-gudevclient.lo
src/gudev/libgudev_1_0_la-gudevdevice.lo
src/gudev/libgudev_1_0_la-gudevenumerator.lo
src/gudev/libgudev_1_0_la-gudevmarshal.lo
src/gudev/libgudev_1_0_la-gudevenumtypes.lo libudev.la -lgio-2.0 -lgobject-2.0
-lglib-2.0 -ldl
libtool: link: rm -fr .libs/libgudev-1.0.exp
libtool: link: /usr/bin/nm -B src/gudev/.libs/libgudev_1_0_la-gudevclient.o
src/gudev/.libs/libgudev_1_0_la-gudevdevice.o
src/gudev/.libs/libgudev_1_0_la-gudevenumerator.o
src/gudev/.libs/libgudev_1_0_la-gudevmarshal.o
src/gudev/.libs/libgudev_1_0_la-gudevenumtypes.o | sed -n -e 's/^.*[
]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][
]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' | sed '/ __gnu_lto/d' | /usr/bin/sed
's/.* //' | sort | uniq > .libs/libgudev-1.0.exp
libtool: link: /usr/bin/grep -E -e "^g_udev_.*" ".libs/libgudev-1.0.exp" >
".libs/libgudev-1.0.expT"
libtool: link: mv -f ".libs/libgudev-1.0.expT" ".libs/libgudev-1.0.exp"
libtool: link: echo "{ global:" > .libs/libgudev-1.0.ver
libtool: link: cat .libs/libgudev-1.0.exp | sed -e "s/\(.*\)/\1;/" >>
.libs/libgudev-1.0.ver
libtool: link: echo "local: *; };" >> .libs/libgudev-1.0.ver
libtool: link: gcc-4.9 -shared -fPIC -DPIC
src/gudev/.libs/libgudev_1_0_la-gudevclient.o
src/gudev/.libs/libgudev_1_0_la-gudevdevice.o
src/gudev/.libs/libgudev_1_0_la-gudevenumerator.o
src/gudev/.libs/libgudev_1_0_la-gudevmarshal.o
src/gudev/.libs/libgudev_1_0_la-gudevenumtypes.o -Wl,-rpath
-Wl,/home/jengelh/nocode/systemd/.libs ./.libs/libudev.so -lgio-2.0
-lgobject-2.0 -lglib-2.0 -ldl -flto -pthread -O2 -Wl,--as-needed
-Wl,--no-undefined -Wl,--gc-sections -Wl,-z -Wl,relro -Wl,-z -Wl,now
-Wl,-fuse-ld=gold -pthread -Wl,-soname -Wl,libgudev-1.0.so.0
-Wl,-version-script -Wl,.libs/libgudev-1.0.ver -o .libs/libgudev-1.0.so.0.1.3
/usr/bin/ld.gold: error: .libs/libgudev-1.0.ver:2:1: syntax error, unexpected
LOCAL, expecting STRING or QUOTED_STRING or EXTERN
/usr/bin/ld.gold: fatal error: unable to parse version script file
.libs/libgudev-1.0.ver
collect2: error: ld returned 1 exit status
make[2]: *** [libgudev-1.0.la] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
ld.bfd does not like it either:
/usr/lib64/gcc/x86_64-suse-linux/4.9/../../../../x86_64-suse-linux/bin/ld:.libs/libgudev-1.0.ver:2:
syntax error in VERSION script
collect2: error: ld returned 1 exit status
$ cat .libs/libgudev-1.0.ver
{ global:
local: *; };
What it probably should be:
WHATEVER { global: local: *; };
The culprit might be this line in libtool, which expressly
omits "WHATEVER".
archive_expsym_cmds="echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~
System is using automake 1.14, libtool 2.4.2, autoconf 2.69,
binutils 2.23.2, gcc 4.8/4.9.
- -export-symbols-regex seems to produce wrong version maps,
Jan Engelhardt <=