启用编译器优化时找不到 glibc
glibc not found when enabling compiler optimizations
我正在为 beaglebone black 设备交叉编译共享库 (miniweb)。当我在没有优化的情况下编译时,我没有问题。但是,如果我使用任何优化进行编译(即 -O3
),我在尝试 运行 我的程序时会得到以下信息:
./myprogram: /lib/arm-linux-gnueabihf/libc.so.6: version `GLIBC_2.15' not found (required by /usr/lib/libminiweb.so)
我的第一个问题,为什么启用优化会突然导致我的程序依赖这个库?禁用优化后内容是否静态包含在库中?
如何确定我的交叉编译器使用的 c 库版本?我在两个系统上 运行 以下命令 ldd --version
:
桌面:
$ ldd --version
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19
Copyright (C) 2014 Free Software Foundation, Inc.
比格尔骨:
ldd --version
ldd (Debian EGLIBC 2.13-38+deb7u1) 2.13
Copyright (C) 2011 Free Software Foundation, Inc.
显然我的库已经过时了,但是你可以看到我的系统报告使用 eglibc
而不是 glibc
?
我的交叉编译库怎么会依赖glibc
?也许我桌面上的 运行ning ldd
不能准确反映我的交叉编译器使用的库?
如何找到我的交叉编译器使用的是哪个 c 库?
My first question, why would enabling optimizations suddenly cause my program to be dependent on this library?
您的程序 依赖于 libc.so.6
,有和没有优化。您可以通过 运行ning ldd ./myprogram
在目标系统上验证这一点。
发生的事情是,您的优化程序变得依赖于 libc.so.6
的 更高版本,然后是您安装的那个。
假设头文件包含以下内容:
inline int foo() { return bar() + 1; }
进一步假设您的程序调用foo
。如果不进行优化,foo
将 不会 内联,您的程序将依赖于 foo
.
通过优化,foo
将内联,您的程序将不再依赖foo
,而是依赖bar
相反。
如果在静态 link 时间,您 link 针对同时提供 foo
和 bar
的库 lifoobar.so
,您的 link有或没有优化都会成功。
如果在动态 link 时间(即在 运行 时间)使用不同版本的 libfoobar.so
,提供 foo
但不提供 bar
,那么未优化的程序将 运行 正常,但优化的程序将失败并显示 bar
未找到。
这就是发生在你身上的事情,只不过你使用的是 versioned 符号 some-libc-func@GLIBC_2.15
而不是 bar
,并且 that 强制您的程序依赖版本 GLIBC_2.15
,这是目标中缺少的。
Is content statically included in the library when optimizations are disabled?
没有
How can I determine the c library version that my cross-compiler is using?
正在使用 libc-2.15.so
或更高版本。您应该查看您的交叉编译器目录。
desktop:
$ ldd --version
您桌面上的内容完全不相关。重要的是你的交叉编译器正在使用什么。
How could my cross-compiled library be dependent on glibc?
您的交叉编译器提供它自己的版本 GLIBC,您的交叉编译二进制文件依赖于那个 GLIBC。
换句话说,这里有 3 个不同版本的 GLIBC:
- 您桌面上的那个(不相关)
- 你的交叉编译器用来link你的二进制文件
- 目标 (beaglebone) 系统上的那个。
我们从错误信息中知道 (2) 至少是 GLIBC-2.15
,并且我们知道 (3) 是 GLIBC-2.13
(太旧了)。
How can I find which c library my cross compiler is using?
在你的交叉编译器安装目录下寻找。
您也可以让 linker 为您打印:
echo "int main() { return 0; }" | /path/to/cross-gcc -Wl,-t -xc -
我正在为 beaglebone black 设备交叉编译共享库 (miniweb)。当我在没有优化的情况下编译时,我没有问题。但是,如果我使用任何优化进行编译(即 -O3
),我在尝试 运行 我的程序时会得到以下信息:
./myprogram: /lib/arm-linux-gnueabihf/libc.so.6: version `GLIBC_2.15' not found (required by /usr/lib/libminiweb.so)
我的第一个问题,为什么启用优化会突然导致我的程序依赖这个库?禁用优化后内容是否静态包含在库中?
如何确定我的交叉编译器使用的 c 库版本?我在两个系统上 运行 以下命令 ldd --version
:
桌面:
$ ldd --version
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19
Copyright (C) 2014 Free Software Foundation, Inc.
比格尔骨:
ldd --version
ldd (Debian EGLIBC 2.13-38+deb7u1) 2.13
Copyright (C) 2011 Free Software Foundation, Inc.
显然我的库已经过时了,但是你可以看到我的系统报告使用 eglibc
而不是 glibc
?
我的交叉编译库怎么会依赖glibc
?也许我桌面上的 运行ning ldd
不能准确反映我的交叉编译器使用的库?
如何找到我的交叉编译器使用的是哪个 c 库?
My first question, why would enabling optimizations suddenly cause my program to be dependent on this library?
您的程序 依赖于 libc.so.6
,有和没有优化。您可以通过 运行ning ldd ./myprogram
在目标系统上验证这一点。
发生的事情是,您的优化程序变得依赖于 libc.so.6
的 更高版本,然后是您安装的那个。
假设头文件包含以下内容:
inline int foo() { return bar() + 1; }
进一步假设您的程序调用foo
。如果不进行优化,foo
将 不会 内联,您的程序将依赖于 foo
.
通过优化,foo
将内联,您的程序将不再依赖foo
,而是依赖bar
相反。
如果在静态 link 时间,您 link 针对同时提供 foo
和 bar
的库 lifoobar.so
,您的 link有或没有优化都会成功。
如果在动态 link 时间(即在 运行 时间)使用不同版本的 libfoobar.so
,提供 foo
但不提供 bar
,那么未优化的程序将 运行 正常,但优化的程序将失败并显示 bar
未找到。
这就是发生在你身上的事情,只不过你使用的是 versioned 符号 some-libc-func@GLIBC_2.15
而不是 bar
,并且 that 强制您的程序依赖版本 GLIBC_2.15
,这是目标中缺少的。
Is content statically included in the library when optimizations are disabled?
没有
How can I determine the c library version that my cross-compiler is using?
正在使用 libc-2.15.so
或更高版本。您应该查看您的交叉编译器目录。
desktop:
$ ldd --version
您桌面上的内容完全不相关。重要的是你的交叉编译器正在使用什么。
How could my cross-compiled library be dependent on glibc?
您的交叉编译器提供它自己的版本 GLIBC,您的交叉编译二进制文件依赖于那个 GLIBC。
换句话说,这里有 3 个不同版本的 GLIBC:
- 您桌面上的那个(不相关)
- 你的交叉编译器用来link你的二进制文件
- 目标 (beaglebone) 系统上的那个。
我们从错误信息中知道 (2) 至少是 GLIBC-2.15
,并且我们知道 (3) 是 GLIBC-2.13
(太旧了)。
How can I find which c library my cross compiler is using?
在你的交叉编译器安装目录下寻找。
您也可以让 linker 为您打印:
echo "int main() { return 0; }" | /path/to/cross-gcc -Wl,-t -xc -