cross-compiling - 启用编译器优化时未找到 glibc

标签 cross-compiling compiler-optimization glibc eglibc

我正在为 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 并不能准确反射(reflect)我的交叉编译器使用的库?

如何找到我的交叉编译器正在使用哪个 C 库?

最佳答案

My first question, why would enabling optimizations suddenly cause my program to be dependent on this library?

您的程序依赖于libc.so.6,无论是否经过优化。您可以通过在目标系统上运行 ldd ./myprogram 来验证这一点。

发生的情况是,您的优化程序变得依赖于 libc.so.6更高版本,然后是您安装的版本。

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

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

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

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

如果在静态链接时,您链接到同时提供 foobar 的库 lifoobar.so,您的链接将会成功或没有优化。

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

这就是发生在你身上的事情,只是你使用的是版本化符号some-libc-func@GLIBC_2.15,而不是bar,并且强制您的程序依赖于版本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. 您的交叉编译器用来链接您的二进制文件
  3. 您的目标 (beaglebone) 系统上的那个。

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

How can I find which c library my cross compiler is using?

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

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

echo "int main() { return 0; }" | /path/to/cross-gcc -Wl,-t -xc - 

关于cross-compiling - 启用编译器优化时未找到 glibc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34214099/

相关文章:

compiler-errors - 谷歌 Protocol Buffer 交叉编译

c - 为什么 x[i]=if 比 if... x[i]= 快

python - 未找到导入 MySQLdb 和 `GLIBC_2.14'

无法创建用于在 Windows 中运行 SDL 游戏的可执行文件(错误 : previous declaration of SDL_main was . ..)

在 Windows 上创建兼容 macOS 和 Linux 的静态库

c++ - 数据对齐 : Reason for restriction on memory address being multiple of data type size

c#:这段代码会得到优化吗?

php shell命令错误GLIBCXX_3.4.9未找到

linux - 交叉编译GCC for linux i686-elf

android - Ghostscript 无法打开初始设备