启用编译器优化时找不到 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 针对同时提供 foobar 的库 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:

  1. 您桌面上的那个(不相关)
  2. 你的交叉编译器用来link你的二进制文件
  3. 目标 (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 -