g++ -static 标志替换动态库加载器

马里奥

首先,我想提供一些背景信息以避免XY 问题

我正在尝试使用 makefiles 和 g++ 编译一个 c++ 程序。我也有静态建立任何依赖关系到程序,而不是“系统库”( ,libz.solibdl.solibstdc++.so)。libm.solibpthread.solibc.solibgcc.so

为了实现这一点,我指定-static为链接器标志,然后所有必须静态链接的依赖项,然后我使用该-Wl, -Bdynamic选项,选项应该告诉链接器链接每个库,在此选项之后,动态链接包括“系统库”因为它们最后链接在一起。(如果我错了,请纠正我。)

LDFLAGS += -Lpath/to/dependencies

# These libs should be linked statically
LDFLAGS += -static
LDFLAGS += -llib1
LDFLAGS += -llib2
LDFLAGS += -llib3

# Libs after this should be linked dynamically.
LDFLAGS += -Wl, -Bdynamic
LDFLAGS += -lz         # If i dont specify these three libraries (z, pthread, dl) 
LDFLAGS += -lpthread   # I get undefined reference errors 
LDFLAGS += -ldl

当我调用 make 时,程序编译并链接得很好,但是当我尝试执行它时,我收到错误:bash: ./program: No such file or directory. 但该文件确实存在。

当我-static从链接器中删除标志时,程序可以正常执行,但是依赖项是动态链接的,这不是我想要的:(。

因此,当我调用file-static标志制作的程序时,我得到了以下信息:

program: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), dynamically linked, interpreter /usr/lib/libc.so.1, for GNU/Linux 4.9.0, not stripped

问题似乎是解释器设置为/usr/lib/libc.so.1而不是/lib/ld-linux.so.2通常应该设置的。至少是这样,当我在没有-static选项的情况下进行编译时

我发现“解释器”实际上是共享库加载器,从我读到的内容来看,我现在假设 bash 告诉我它找不到程序,因为库加载器是错误的(即使我没有”不太明白这个的细节)。

所以基本上我的问题是:为什么libc.so在我-static为链接器指定选项将库加载器设置为以及如何告诉链接器在-static指定时使用正确的库加载器

n. '代词' m.

您的错误是混合的,-static并且-Bdynamic是编译器和链接器标志。不要那样做。如果您使用-Wl, gcc 只是盲目地将这些标志传递给链接器,但如果您不使用,它会重新排列整个链接行。(检查它的作用gcc -v)。

混合创建了不一致和错误的链接命令。我不知道为什么 gcc 至少不会对此发出警告,但它没有,并且默默地将动态加载程序设置为不存在的文件。

您希望始终使用-Wl,-Bstatic-Wl,-Bdynamic始终如一。不是-Bstaticand -Bdynamic,因为 gcc 逻辑与 ld 不同。

这将创建一个正确的动态链接可执行文件,其中链接了一些静态库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

链接器错误Android-NDK:对“ G_STATIC_ASSERT”的未定义引用

来自分类Dev

G ++动态库链接问题

来自分类Dev

Libtool正在丢弃“ -static”标志

来自分类Dev

Javascript:替换“ g”字符

来自分类Dev

g ++ -MG标志的异常行为

来自分类Dev

g ++标志仅检查语法?

来自分类Dev

何时对GCC使用-g标志

来自分类Dev

排序命令:-g与-n标志

来自分类Dev

G ++的链接器错误

来自分类Dev

用`-static`标志编译R包

来自分类Dev

如何正确地将ffmpeg链接到静态版本“ g ++ -static”?

来自分类Dev

双重嵌套模板类中的c ++ static int def对于clang ++和g ++失败

来自分类Dev

如何正确地将ffmpeg链接到静态版本“ g ++ -static”?

来自分类Dev

双重嵌套模板类中的c ++ static int def对于clang ++和g ++失败

来自分类Dev

G ++无法找到Boost库

来自分类Dev

Linux上与G ++共享的库

来自分类Dev

g ++找不到共享库

来自分类Dev

用g ++链接opencv库

来自分类Dev

用G ++链接库

来自分类Dev

gcc是否有放弃-g标志的选项?

来自分类Dev

g ++在-Os处启用错误标志

来自分类Dev

g ++标志的含义-Wall -W -Werror

来自分类Dev

PostgreSQL regexp_replace'g'标志

来自分类Dev

g ++链接器功能的错误

来自分类Dev

了解g ++链接器故障

来自分类Dev

动态设置express.static目录

来自分类Dev

链接器命令失败,在g ++中带有-o3标志的退出代码1

来自分类Dev

为什么g ++在打印c ++时需要-fpermissive标志来打印迭代器值?

来自分类Dev

链接器命令失败,在g ++中带有-o3标志的退出代码1