2

我正在为 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?也许ldd在我的桌面上运行并不能准确反映我的交叉编译器使用的库?

如何找到我的交叉编译器使用的 c 库?

4

1 回答 1

2

我的第一个问题,为什么启用优化会突然导致我的程序依赖于这个库?

您的程序取决于有无libc.so.6优化。ldd ./myprogram您可以通过在目标系统上运行来验证这一点。

发生的事情是您的优化程序依赖于您安装的程序的更高版本。libc.so.6

假设一个头文件包含以下内容:

inline int foo() { return bar() + 1; }

进一步假设您的程序调用foo. 如果没有优化,foo不会被内联,并且您的程序将依赖于foo.

通过优化,foo 内联,您的程序将不再依赖于foo,而是依赖于bar

如果在静态链接时,您链接到lifoobar.so同时提供fooand的库,则无论bar是否优化,您的链接都会成功。

如果在动态链接时(即在运行时)使用不同版本的libfoobar.so,提供foo但不提供的版本bar,则未优化的程序将运行良好,但优化的程序将失败并bar找不到。

这就是发生在你身上的事情,只是bar你使用的是版本符号some-libc-func@GLIBC_2.15迫使你的程序依赖于版本GLIBC_2.15,这是目标所缺少的。

禁用优化时内容是否静态包含在库中?

不。

如何确定我的交叉编译器使用的 c 库版本?

它正在使用libc-2.15.so或更高版本。您应该查看您的交叉编译器目录。

桌面: $ ldd --version

您在桌面上拥有的东西完全无关紧要。重要的是您的交叉编译器正在使用什么。

我的交叉编译库如何依赖 glibc?

您的交叉编译器提供了自己的 GLIBC 版本,而您的交叉编译二进制文件依赖于GLIBC。

换句话说,这里有 3 个不同版本的 GLIBC:

  1. 你桌面上的那个(无关的)
  2. 你的交叉编译器用来链接你的二进制文件的那个
  3. 你的目标(beaglebone)系统上的那个。

我们知道 (2) 至少GLIBC-2.15来自错误消息,并且我们知道 (3) 是GLIBC-2.13(这太旧了)。

如何找到我的交叉编译器使用的 c 库?

在您的交叉编译器安装目录下查找它。

您也可以要求链接器为您打印它:

echo "int main() { return 0; }" | /path/to/cross-gcc -Wl,-t -xc - 
于 2015-12-11T04:52:45.167 回答