将64位glibc静态链接到二进制文件中

3
也许这暴露了我在链接和编译方面的幼稚。我试图编译一些Fortran代码,使其可以作为独立的二进制文件运行。其中一个问题(有几个问题)是,我想在拥有GLIBC 2.14的系统上进行编译,但在拥有2.11的系统上运行。是否可能静态链接像GLIBC这样的库,或者由于库的大小而无法实现?我的Makefile使用-static、-static-libgcc和-static-libgfortran标志以及以下编译器标志。
-c -cpp -fall-intrinsics -ffpe-trap=invalid,zero -std=f2003

然而,当我在输出上使用ldd时,我得到
linux-vdso.so.1 =>  (0x00007fff13b63000)
libgfortran.so.3 => /usr/lib64/libgfortran.so.3 (0x00007febfd7cf000)
libm.so.6 => /lib64/libm.so.6 (0x00007febfd578000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007febfd362000)
libquadmath.so.0 => /usr/lib64/libquadmath.so.0 (0x00007febfd12c000)
libc.so.6 => /lib64/libc.so.6 (0x00007febfcd9c000)
/lib64/ld-linux-x86-64.so.2 (0x00007febfdae7000)

更新

我正在编译的机器正在运行openSUSE 12.2操作系统:

Linux 3.4.33-2.24-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux

我正在尝试在一台openSUSE 11.4的机器上执行:

Linux 2.6.37.6-24-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux

更新2

我已经重新编写了Makefile,并试图使用ifort(英特尔编译器)进行编译,因为它提供了static-intel标志,可以减少一些依赖关系。

现在我的ldd输出结果是:

linux-vdso.so.1 =>  (0x00007fff381ff000)
libm.so.6 => /lib64/libm.so.6 (0x00007f89b07cf000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f89b05b2000)
libc.so.6 => /lib64/libc.so.6 (0x00007f89b0222000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f89b001e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f89b0a26000)

使用以下编译器标志:

FCFLAGS = -cpp -static-intel -static-libgcc

问题是如果我只使用 -static(或者-static-intel -static),那么会出现以下情况:
ld: cannot find -lm
ld: cannot find -lpthread
ld: cannot find -lc
ld: cannot find -ldl
ld: cannot find -lc
make: *** [IDP] Error 1

我认为这是因为我的系统上没有这些库的静态版本。

更新3

我也尝试了提供共享对象库的方法(如此帖子所建议),但只会导致分段错误。


1
由于许可问题,可能无法静态链接glibc -他们希望确保您程序的任何用户都能够使用其自己选择的其他库。 - Mark Ransom
1
什么操作系统? - M. S. B.
1
“-c”编译器选项提示您有一个单独的链接步骤。除了许多对象文件名之外,哪些选项会传递给链接器?在我的测试中,“gfortran -static -o test.exe test.f90”生成一个真正的静态可执行文件。 - Hristo Iliev
1
为什么在OpenSUSE 11.4机器上无法编译? - Kyle Kanos
1
这是一个常见的问题。从2011年开始,所有后续发行版都没有64位库的静态版本。它们使用32位版本进行安装,但不包括64位版本。您只需使用libm、libc等共享库版本即可。 - cup
显示剩余3条评论
1个回答

3

这是一个常见的问题。从2011年开始,所有后续版本都没有64位库的静态版本。它们只提供32位版本,而不提供64位版本。您只需使用libm、libc等共享库版本即可。


@VladimirF 你从哪里得到的?我在网上找不到任何关于如何获取静态库的信息。 - Alex
从软件包管理器中,安装`glibc-devel-static'软件包。http://software.opensuse.org/package/glibc-devel-static - Vladimir F Героям слава

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接