相关疑难解决方法(0)

Linux静态链接已经死了?

事实上,Linux上的-static gcc标志现在不起作用.让我引用GNU libc FAQ:

2.22.即使是静态链接的程序也需要一些我不能接受的共享库.我能做什么?

如果没有共享库,{AJ} NSS(详细信息只需输入`info libc"Name Service Switch"')将无法正常工作.NSS允许通过仅更改一个配置文件(/etc/nsswitch.conf)而不重新链接任何程序来使用不同的服务(例如NIS,文件,db,hesiod).唯一的缺点是现在静态库需要访问共享库.这由GNU C库透明地处理.

解决方案是使用--enable-static-nss配置glibc.在这种情况下,您可以创建一个仅使用服务dns和文件的静态二进制文件(为此更改/etc/nsswitch.conf).您需要明确链接所有这些服务.例如:

 gcc -static test-netdb.c -o test-netdb \
   -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于您必须将使用NSS例程的每个静态程序与所有这些库链接起来.
{UD}事实上,不能再说使用此选项编译的libc正在使用NSS.没有开关了.因此,强烈 建议不要使用--enable-static-nss,因为这会使系统上程序的行为不一致.

关于这个事实,现在有什么合理的方法可以在Linux上创建一个功能齐全的静态构建,或者静态链接在Linux上完全没用?我的意思是静态构建:

  • 行为与动态构建完全相同(静态nss具有不一致的行为是邪恶的!);
  • 适用于glibc环境和Linux版本的合理变体;

linux gcc glibc static-linking

61
推荐指数
6
解决办法
4万
查看次数

GCC动态链接libc static和其他一些库,重新访问?

以下问题是相关的,但不回答我的问题:

在GCC中链接部分静态和部分动态

将动态库链接到链接到其他静态库的静态库

GCC:静态链接只有一些库

gcc中共享库函数的静态链接

我之前提出了一个非常类似的问题,但是由于我开始的上一个问题在评论部分有些混乱而没有得到完全回答(但我将其标记为已回答,因为这是一项很好的努力并至少部分回答了它)我会问一个新问题.问题是具体如何将libc链接为静态,同时动态链接其他库(例如libm).有人提出在第一个问题中无法做到,是真的吗?如果是这样,知道为什么不是很有趣.

甚至可以这样做吗?有人发表了意见(这是出于某种原因删除,也许这是不正确的?),这是可能的,但那么一定存在libc中的动态链接的版本,因为它会通过动态库需要(如动态的libm会需要动态libc(?)).

这对我来说很好,但对我来说如何告诉GCC这样做并不明显,即在libc中链接为静态和动态.我该怎么做(我做了几次尝试,有些会在后面的问题中展示)?或者还有其他方法可以做我想要的吗?

我们首先看到,通过简单地运行gcc test.c -lm,一切都是动态链接的,如下所示:

$ gcc test.c -lm
$ ldd a.out 
        linux-vdso.so.1 (0x00007fffb37d1000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f3b0eeb6000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f3b0eb10000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3b0f1b0000)
Run Code Online (Sandbox Code Playgroud)

要仅将libm链接为静态,同时允许libc保持动态,我们可以这样做(正如Z boson在前面提到的一个问题中指出的那样):

$ gcc test.c /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libm.a

$ ldd a.out 
        linux-vdso.so.1 (0x00007fff747ff000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f09aaa0c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f09aadb2000)
Run Code Online (Sandbox Code Playgroud)

但是,尝试使用相同的过程来链接libc static和libm dynamic,似乎不起作用:

$ gcc test.c /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libc.a -lm
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../x86_64-pc-linux-gnu/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.3/../../../../lib64/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink …
Run Code Online (Sandbox Code Playgroud)

c static gcc

16
推荐指数
2
解决办法
4万
查看次数

将C++编译成可移植的Linux二进制文件

好的,这个问题是关于便携式的,因为没有依赖关系(即"我可以将二进制文件放在USB密钥中,随身携带,发送给朋友等等").

我听说过静态连接,但我很困惑它的后果是什么; 什么可以和什么不能静态链接(即Qt,OpenGL,libstdc ++怎么样?)以及之后二进制将"可移植"的程度.

我也听说过LSB(Linux标准基础版),但我不确切地知道它是什么,或者它在这个意义上是否有帮助.

c++ portability portable-executable static-linking

11
推荐指数
2
解决办法
5967
查看次数

在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
查看次数

标签 统计

c++ ×2

gcc ×2

static-linking ×2

c ×1

cmake ×1

glibc ×1

libc ×1

linux ×1

musl ×1

portability ×1

portable-executable ×1

static ×1

uclibc ×1