Bug #492
Linking fails on i686 with -fstack-protector-strong
0%
Description
Several plugins cannot be linked on a i686 system
with the compiler flag "-fstack-protector-strong".
Originally reported on the Arch Linux AUR page.
Reproduced on Arch Linux i686 with g++ 4.9.2.
Affected plugins:
- cairo-spectrum
- gl-spectrum
- statusicon
The error message and config.log are attached.
History
#1
Updated by John Lindgren almost 11 years ago
An undefined reference in libc doesn't seem like a bug in Audacious. Do you have any reason for supposing it to be one, or a proposed fix?
#2
Updated by Michael Schwendt almost 11 years ago
The error.txt is truncated. What are the preceeding lines that show how the compiler was invoked?
-fstack-protector-strong is also used by Fedora builds, and the build of 3.6-alpha1 succeeds for i686.
#3
Updated by Thomas Lange almost 11 years ago
- File makepkg.log makepkg.log added
@Michael:
The compiler was invoked by the tool "makepkg" of Arch Linux, its complete log file is attached.
The flags are the defaults for Arch Linux:
CPPFLAGS="-D_FORTIFY_SOURCE=2" CFLAGS="-march=i686 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4" CXXFLAGS="-march=i686 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4" LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro"
@John:
If "-lc" is added to LDFLAGS it links successfully.
#4
Updated by John Lindgren almost 11 years ago
Thomas Lange wrote:
If "-lc" is added to LDFLAGS it links successfully.
"-lc" shouldn't be necessary since we use "g++" for the link command. It should link in the C and C++ runtime libraries automatically, I would think.
#5
Updated by Michael Schwendt almost 11 years ago
The default build output is "silent". When the configure script doesn't handle --disable-silent-rules option, something like
sed -i '\,^.SILENT:,d' buildsys.mk.in
to get verbose build output. Only in verbose build output one gets to see compiler/linker warnings which may be relevant.
#6
Updated by Thomas Lange almost 11 years ago
- File verbose.log verbose.log added
Thanks, new verbose output file is attached.
glibc on Arch is compiled without fstack-protector-strong.
https://projects.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/glibc#n59
Could this be related? How does Fedora compile it?
#7
Updated by John Lindgren almost 11 years ago
Maybe -fstack-protector-strong needs to be in LDFLAGS as well as CFLAGS?
#8
Updated by Michael Schwendt almost 11 years ago
It doesn't need to be present in LDFLAGS.
$ objdump -tT /usr/lib64/libc.so.6 |grep stack_chk 0000000000000000 l df *ABS* 0000000000000000 stack_chk_fail.c 00000000001122c0 g F .text 0000000000000010 __stack_chk_fail 00000000001122c0 g DF .text 0000000000000010 GLIBC_2.4 __stack_chk_fail
How does Fedora compile it?
glibc build logs: http://koji.fedoraproject.org/koji/buildinfo?buildID=581316
Audacious 3.6-alpha1 i686 build log for a private Fedora 21 build:
https://copr-be.cloud.fedoraproject.org/results/mschwendt/audacious-next/fedora-21-i386/audacious-plugins-3.6-0.3.alpha1.fc21/build.log
$ rpm -E %configure
CFLAGS="${CFLAGS:--O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic}" ; export CFLAGS ;
CXXFLAGS="${CXXFLAGS:--O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic}" ; export CXXFLAGS ;
FFLAGS="${FFLAGS:--O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -I/usr/lib64/gfortran/modules}" ; export FFLAGS ;
FCFLAGS="${FCFLAGS:--O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -I/usr/lib64/gfortran/modules}" ; export FCFLAGS ;
LDFLAGS="${LDFLAGS:--Wl,-z,relro }"; export LDFLAGS;
[ "1" = 1 ] && for i in $(find . -name config.guess -o -name config.sub) ; do
[ -f /usr/lib/rpm/redhat/$(basename $i) ] && /usr/bin/rm -f $i && /usr/bin/cp -fv /usr/lib/rpm/redhat/$(basename $i) $i ;
done ;
[ "1" = 1 ] && [ x != "x" ] &&
for i in $(find . -name ltmain.sh) ; do
/usr/bin/sed -i.backup -e 's~compiler_flags=$~compiler_flags=""~' $i
done ;
./configure --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu \
--program-prefix= \
--disable-dependency-tracking \
--prefix=/usr \
--exec-prefix=/usr \
--bindir=/usr/bin \
--sbindir=/usr/sbin \
--sysconfdir=/etc \
--datadir=/usr/share \
--includedir=/usr/include \
--libdir=/usr/lib64 \
--libexecdir=/usr/libexec \
--localstatedir=/var \
--sharedstatedir=/var/lib \
--mandir=/usr/share/man \
--infodir=/usr/share/info
#9
Updated by John Lindgren almost 11 years ago
So can we say:
1. Compiling with -fstack-protector-strong works fine on Fedora, so there's something different about the Arch Linux makepkg environment that is (directly or indirectly) causing the problem.
2. A workaround for makepkg is to link with "-lc", but this is only a workaround, not a proper fix, since libc ought to be linked in automatically.
... and close this report?
#10
Updated by Michael Schwendt almost 11 years ago
1. Agreed. It seems the toolchain is broken with Arch Linux.
2. True. It's g++'s responsibility to link with the C/C++/GCC/Math libs as needed, not Audacious'.
#11
Updated by Thomas Lange almost 11 years ago
- Status changed from New to Closed
All right, marking as closed.
#12
Updated by Thomas Lange almost 11 years ago
The issue was solved by the lastest updates.
binutils 2.25 and GCC 4.9.2 20141224 now link successfully.
