相关疑难解决方法(0)

使用较旧的libc进行编译(未找到版本`GLIBC_2.14')

我必须在当前的ubuntu(12.04)上编译程序.然后,该程序应使用具有较旧内核(2.6.18)的CentOS在集群上运行.不幸的是,我不能直接在集群上编译.如果我只是编译并复制程序而没有任何更改,我会收到错误消息"kernel too old".

我理解它的方式,其原因不是内核版本,而是用于编译的libc版本.所以我尝试编译我的程序动态链接集群中的libc并静态链接其他所有内容.

研究

在SO上已经有很多关于这方面的问题,但没有一个答案对我有用.所以这是我对该主题的研究:

  • 这个问题解释了内核过旧消息的原因
  • 这个问题类似,但更专业,没有答案
  • 这里提出的静态链接不起作用,因为集群上的libc太旧了.一个答案还提到使用旧的libc进行构建,但没有解释如何执行此操作.
  • 一种方法是在运行旧操作系统的VM中进行编译.这工作但很复杂.我还读到你不应该静态链接libc
  • 显然,是可以编译为不同的libc版本的选项-rpath,但是这并没有为我工作(见下文)

当前状态

我将以下文件从群集复制到目录中 /path/to/copied/libs

  • libc-2.5.so
  • libgcc_s.so.1
  • 的libstdc ++.so.6

并正在编译选项 -nodefaultlibs -Xlinker -rpath=/path/to/copied/libs -Wl,-Bstatic,-lrt,-lboost_system,-lboost_filesystem -Wl,-Bdynamic,-lc,-lstdc++,-lgcc_s

编译二进制文件的ldd输出是

mybin: /path/to/copied/libs/libc.so.6: version `GLIBC_2.14' not found (required by mybin)
mybin: /path/to/copied/libs/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by mybin)
linux-vdso.so.1 =>  (0x00007ffff36bb000)
libc.so.6 => /path/to/copied/libs/libc.so.6 (0x00007fbe3789a000)
libstdc++.so.6 => /path/to/copied/libs/libstdc++.so.6 (0x00007fbe37599000)
libgcc_s.so.1 => /path/to/copied/libs/libgcc_s.so.1 (0x00007fbe3738b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbe37bf3000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbe37071000)
Run Code Online (Sandbox Code Playgroud)

我对这个错误感到有些困惑,因为它使用了正确的路径(即集群中的libc),但仍然抱怨缺少glibc版本.在群集上运行ldd时,它返回not a dynamic executable并运行二进制文件会产生上述相同的两个错误.它看起来还包括其他库(linux-vdso.so.1,ld-linux-x86-64.so.2和libm.so.6).我也应该使用旧版本吗? …

linker gcc shared-libraries

37
推荐指数
1
解决办法
4万
查看次数

如何使用自定义版本的glibc和静态链接构建C程序?

我已经构建了glibc 2.14并将其安装在目录中~/GLIBC/glibc_install.现在我想使用这个C库而不是系统的默认C库来构建和运行程序.

  • 为了确保我使用的是自定义glibc,我添加了一个put glibc/stdio-common/printf.c:__printf来打印消息的调用.

  • 然后我重建并重新安装了glibc.

  • 然后我写了一个"Hello,World"程序并尝试编译并链接如下:

    gcc -nodefaultlibs -static -lgcc -L~/GLIBC/glibc_install/lib -o myprog myprog.c
    
    Run Code Online (Sandbox Code Playgroud)

但是我得到以下链接器错误报告:

/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x19): undefined reference to `__libc_csu_init'
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x25): undefined reference to `__libc_start_main'
/tmp/ccACTQEp.o: In function `main':
c1.c:(.text+0xa): undefined reference to `puts'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

c glibc ld static-linking

21
推荐指数
3
解决办法
1万
查看次数

在cmake项目中使用替代libc

我有一个使用CMake构建的C / C ++项目。在尝试编译静态二进制文件时,我GLIBC在计算机和目标计算机上遇到了不同版本的问题。在关于SO的另一个问题中,对类似问题的公认答案是使用libc的替代实现,例如musluClibc。(请参阅此处

我找不到有关如何指向cmake使用此类替代libc的任何信息。FindMusl.cmake文件既没有寄出,也无法在互联网上找到。简单使用CC=/usr/bin/musl-gcc是行不通的。

如何将我的cmake项目与此类替代libc实现静态链接,使其独立于GLIBC?

c++ cmake libc uclibc musl

6
推荐指数
1
解决办法
2272
查看次数

在Fedora 18上针对Centos 6.4进行交叉编译

我正在Fedora 18机器上开发一个项目,该项目使用C ++ 11标准中的类,并希望将其部署在Centos 6.4服务器上。

除了libc和libc ++版本(分别为GLIBC_2.11,GLIBCXX_3.4.15和在我的Fedora机器上的GLIBC_2.14和至少GLIBCXX_3.4.17上),我能够解决所有加载程序错误。

是否可以告诉编译器针对服务器版本或库的旧兼容版本进行编译/链接?

当我运行ldd可执行文件时,我得到

./executable: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./executable)
./executable: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./executable)
Run Code Online (Sandbox Code Playgroud)

提前致谢!

c++ fedora cross-compiling c++11 centos6

2
推荐指数
1
解决办法
2163
查看次数

标签 统计

c++ ×2

c ×1

c++11 ×1

centos6 ×1

cmake ×1

cross-compiling ×1

fedora ×1

gcc ×1

glibc ×1

ld ×1

libc ×1

linker ×1

musl ×1

shared-libraries ×1

static-linking ×1

uclibc ×1