由于 libffi 中未定义的引用,构建 Glib 时出错
Error building Glib due to undefined reference in libffi
我目前正致力于在 x86-64 上的 CentOS 7 运行 上构建 Glib 版本 2.45.8,目标是基于 x86-64 上的 Linux from Scratch 运行 的自定义发行版.使用 3.2.1 版的 libffi link 存在问题。
path/to/build/directory/bin/ld: warning: libc.so.6, needed by //lib/../libffi.so, not found (try using -rpath or -rpath-link)
path/to/build/directory/lib64/libffi.so: undefined reference to `free@GLIBC_2.2.5'
path/to/build/directory/lib64/libffi.so: undefined reference to `mkostemp@GLIBC_2.7'
(etc ... there are about 15 undefined references total)
path/to/build/directory/lib64/libffi.so: undefined reference to `__getdelim@GLIBC_2.2.5'
path/to/build/directory/lib64/libffi.so: undefined reference to `getenv@GLIBC_2.2.5'
使用 -rpath 或 -rpath-link 将不起作用,因为 libc.so.6 文件在我构建的文件系统中不存在。
但是我在 path/to/build/directory/lib64/
目录中确实有 libc.so
和 libc.so.0
,但找不到 libc.so.6
。
这是我的 ./configure 和 make 命令。
glib_cv_stack_grows=no \
glib_cv_uscore=no \
ac_cv_func_posix_getpwuid_r=yes \
ac_cv_func_posix_getgrgid_r=yes \
LIBFFI_CFLAGS=-lffi \
LIBFFI_LIBS=-lffi \
ZLIB_CFLAGS=-lz \
ZLIB_LIBS=-lz \
PKG_CONFIG_LIBDIR=$TARG/lib/pkgconfig \
./configure --prefix=/ --host=x86_64-linux --with-libiconv
make -j32 LDFLAGS=-liconv
如何构建正确的 libc.so?
我们必须做几件事来解决这个问题。
我发现的第一件事是,如果软件依赖于 libc.so.6,那么它是针对 glibc 构建的。
然而,我们用于此构建的工具链改用 uClibc,它在构建时不会生成 libc.so.6。
解决方案是将 LIBFFI 和 ZLIB clags 和 libs 写入 link 到使用 uClibc 构建的 libffi 和 zlib。
glib_cv_stack_grows=no \
glib_cv_uscore=no \
ac_cv_func_posix_getpwuid_r=yes \
ac_cv_func_posix_getgrgid_r=yes \
ZLIB_CFLAGS=-I$TARG/include \
ZLIB_LIBS="-L$TARG/lib -lz" \
LIBFFI_CFLAGS=-I$TARG/include \
LIBFFI_LIBS="$TARG/lib/libffi.a" \
PKG_CONFIG_LIBDIR=$TARG/lib/pkgconfig \
./configure --prefix=/ --host=x86_64-linux --with-libiconv
make -j32 LDFLAGS=-liconv
我目前正致力于在 x86-64 上的 CentOS 7 运行 上构建 Glib 版本 2.45.8,目标是基于 x86-64 上的 Linux from Scratch 运行 的自定义发行版.使用 3.2.1 版的 libffi link 存在问题。
path/to/build/directory/bin/ld: warning: libc.so.6, needed by //lib/../libffi.so, not found (try using -rpath or -rpath-link)
path/to/build/directory/lib64/libffi.so: undefined reference to `free@GLIBC_2.2.5'
path/to/build/directory/lib64/libffi.so: undefined reference to `mkostemp@GLIBC_2.7'
(etc ... there are about 15 undefined references total)
path/to/build/directory/lib64/libffi.so: undefined reference to `__getdelim@GLIBC_2.2.5'
path/to/build/directory/lib64/libffi.so: undefined reference to `getenv@GLIBC_2.2.5'
使用 -rpath 或 -rpath-link 将不起作用,因为 libc.so.6 文件在我构建的文件系统中不存在。
但是我在 path/to/build/directory/lib64/
目录中确实有 libc.so
和 libc.so.0
,但找不到 libc.so.6
。
这是我的 ./configure 和 make 命令。
glib_cv_stack_grows=no \
glib_cv_uscore=no \
ac_cv_func_posix_getpwuid_r=yes \
ac_cv_func_posix_getgrgid_r=yes \
LIBFFI_CFLAGS=-lffi \
LIBFFI_LIBS=-lffi \
ZLIB_CFLAGS=-lz \
ZLIB_LIBS=-lz \
PKG_CONFIG_LIBDIR=$TARG/lib/pkgconfig \
./configure --prefix=/ --host=x86_64-linux --with-libiconv
make -j32 LDFLAGS=-liconv
如何构建正确的 libc.so?
我们必须做几件事来解决这个问题。 我发现的第一件事是,如果软件依赖于 libc.so.6,那么它是针对 glibc 构建的。 然而,我们用于此构建的工具链改用 uClibc,它在构建时不会生成 libc.so.6。 解决方案是将 LIBFFI 和 ZLIB clags 和 libs 写入 link 到使用 uClibc 构建的 libffi 和 zlib。
glib_cv_stack_grows=no \
glib_cv_uscore=no \
ac_cv_func_posix_getpwuid_r=yes \
ac_cv_func_posix_getgrgid_r=yes \
ZLIB_CFLAGS=-I$TARG/include \
ZLIB_LIBS="-L$TARG/lib -lz" \
LIBFFI_CFLAGS=-I$TARG/include \
LIBFFI_LIBS="$TARG/lib/libffi.a" \
PKG_CONFIG_LIBDIR=$TARG/lib/pkgconfig \
./configure --prefix=/ --host=x86_64-linux --with-libiconv
make -j32 LDFLAGS=-liconv