Date: Sat, 21 Dec 2013 16:45:15 GMT From: Ryan Lortie <desrt@desrt.ca> To: freebsd-gnats-submit@FreeBSD.org Subject: misc/185071: python3-config --ldflags returning bad values (no -L/usr/local/lib) Message-ID: <201312211645.rBLGjFC0024258@oldred.freebsd.org> Resent-Message-ID: <201312211650.rBLGo002037106@freefall.freebsd.org>
index | next in thread | raw e-mail
>Number: 185071
>Category: misc
>Synopsis: python3-config --ldflags returning bad values (no -L/usr/local/lib)
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sat Dec 21 16:50:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator: Ryan Lortie
>Release: FreeBSD 10-RC1
>Organization:
>Environment:
FreeBSD beastie 10.0-RC1 FreeBSD 10.0-RC1 #0 r259068: Sat Dec 7 17:45:20 UTC 2013 root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC amd64
>Description:
python3-config is returning bad values with python33 installed via 'pkg'.
[desrt@beastie ~]$ python3-config --ldflags
-L/usr/local/lib/python3.3/config-3.3m -lintl -lutil -lm -lpython3.3m -Wl,--export-dynamic
The problem is that there is no -L/usr/local/lib in here, which prevents shared linking against the -lpython3.3m found in /usr/local/lib. Instead, the linker will find only the static library in /usr/local/lib/python3.3/config-3.3m and try to use that instead. That will fail if trying to build another library, because the static library wasn't built with -fPIC.
For comparison, note:
[desrt@beastie ~]$ python2-config --ldflags
-L/usr/local/lib/python2.7/config -L/usr/local/lib -pthread -lintl -lutil -lm -lpython2.7 -Wl,--export-dynamic
Note also that the shared library is installed properly:
[desrt@beastie ~]$ ls -l /usr/local/lib/libpython3*
-r-xr-xr-x 1 root wheel 3736818 Dec 12 12:23 /usr/local/lib/libpython3.3m.a
lrwxr-xr-x 1 root wheel 18 Dec 12 12:23 /usr/local/lib/libpython3.3m.so -> libpython3.3m.so.1
-r-xr-xr-x 1 root wheel 2251736 Dec 12 12:23 /usr/local/lib/libpython3.3m.so.1
>How-To-Repeat:
Try to build a library that depends on python3. libpeas from GNOME is one such example. You will see this:
[desrt@beastie /usr/home/desrt/jhbuild/checkout/libpeas/loaders/python3]$ gmake V=1
/bin/sh ../../libtool --tag=CC --mode=link cc -isystem /usr/local/include -module -avoid-version -L/usr/local/lib/python3.3/config-3.3m -lintl -lutil -lm -lpython3.3m -Wl,--export-dynamic -L/home/desrt/jhbuild/install/lib -Wl,-Y/usr/local/lib -o libpython3loader.la -rpath /home/desrt/jhbuild/install/lib/libpeas-1.0/loaders peas-plugin-loader-python.lo -Wl,--export-dynamic -lgmodule-2.0 -pthread -lgio-2.0 -lgirepository-1.0 -lgobject-2.0 -L/home/desrt/jhbuild/install/lib -lglib-2.0 -lintl -lgobject-2.0 -L/home/desrt/jhbuild/install/lib -lglib-2.0 -lintl -lintl -lutil -lm -lpython3.3m
libtool: link: cc -shared -fPIC -DPIC .libs/peas-plugin-loader-python.o -L/usr/local/lib/python3.3/config-3.3m -L/home/desrt/jhbuild/install/lib -lgmodule-2.0 -lgio-2.0 -lgirepository-1.0 -lgobject-2.0 -lglib-2.0 -lintl -lutil -lm -lpython3.3m -Wl,--export-dynamic -Wl,-Y/usr/local/lib -Wl,--export-dynamic -pthread -pthread -Wl,-soname -Wl,libpython3loader.so -o .libs/libpython3loader.so
/usr/bin/ld: /usr/local/lib/python3.3/config-3.3m/libpython3.3m.a(abstract.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/python3.3/config-3.3m/libpython3.3m.a: could not read symbols: Bad value
cc: error: linker command failed with exit code 1 (use -v to see invocation)
gmake: *** [libpython3loader.la] Error 1
>Fix:
The python3-config script contains this code:
elif opt in ('--libs', '--ldflags'):
libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
libs.append('-lpython' + pyver + sys.abiflags)
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
# shared library in prefix/lib/.
if opt == '--ldflags':
if not getvar('Py_ENABLE_SHARED'):
libs.insert(0, '-L' + getvar('LIBPL'))
if not getvar('PYTHONFRAMEWORK'):
libs.extend(getvar('LINKFORSHARED').split())
print(' '.join(libs))
The values of various things, from my python3 install:
>Release-Note:
>Audit-Trail:
>Unformatted:
>>> getvar('Py_ENABLE_SHARED')
0
>>> getvar('PYTHONFRAMEWORK')
''
>>> getvar('LIBPL')
'/usr/local/lib/python3.3/config-3.3m'
>>> getvar('LINKFORSHARED')
'-Wl,--export-dynamic'
>>> getvar('LIBS')
'-lintl -lutil'
>>> getvar('SYSLIBS')
'-lm'
>>> sys.abiflags
'm'
>>> getvar('VERSION')
'3.3'
Note this line in python2-config:
elif opt in ('--libs', '--ldflags'):
libs = getvar("LDFLAGS").split() + getvar('LIBS').split() + getvar('SYSLIBS').split()
ie: getvar("LDFLAGS") is here, while missing in python3. On my system python3:
>>> getvar("LDFLAGS")
'-L/usr/local/lib -pthread'
So it seems that the fix is to make sure getvar("LDFLAGS") is in the python3-config version of this line...
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201312211645.rBLGjFC0024258>
