Articles of 链接器

在linux下用mingw32交叉编译链接libcurl for Windows

我已经使用mingw32编译了libcurl,并试图用我的Linux机器上的mingw32作为Windows系统的程序来链接它。 我输出的文件是libcurl-4.dll libcurl.a libcurl.la libcurl.lai。 我已经将它们包含在我的mingw32 libs文件夹中:/ usr / x86_64-w64-mingw32 / lib 我能够find一些与libstdc ++和libgcc链接的其他主题,以便在执行时关注依赖性错误,但是当尝试添加libcurl.a时,它不会编译期间。 我使用了以下内容: $ x86_64-w64-mingw32-g++ main.cpp -o hello.exe -static-libgcc -static-libstdc++ -static "/usr/x86_64-w64-mingw32/lib/libcurl.a" -lpthread 但是,我不能得到它使用libcurl.a,并继续收到这些错误。 /tmp/ccIceRus.o:main.cpp:(.text+0xde): undefined reference to `__imp_curl_easy_init' /tmp/ccIceRus.o:main.cpp:(.text+0x106): undefined reference to `__imp_curl_easy_setopt' /tmp/ccIceRus.o:main.cpp:(.text+0x122): undefined reference to `__imp_curl_easy_setopt' /tmp/ccIceRus.o:main.cpp:(.text+0x13e): undefined reference to `__imp_curl_easy_setopt' /tmp/ccIceRus.o:main.cpp:(.text+0x159): undefined reference to `__imp_curl_easy_setopt' /tmp/ccIceRus.o:main.cpp:(.text+0x169): undefined reference to […]

为什么链接器修改一个–defsym“绝对地址”

目标:使用可执行文件(不导出符号)的函数的共享库。 意思是: gcc -Wl,–defsym,function=0x432238 手册页指出: "–defsym symbol=expression" Create a global symbol in the output file, containing the absolute address given by expression. 令我沮丧的是, dlopen()将共享库的基地址(这是64位代码) 0x7ffff676f000添加到导出的“绝对符号地址”中: executable shared library ———- linker ————– symbol: 0x432238 =====> 0x7ffff6ba1238 objdump在库中显示正确的符号地址( 0x432238 ),但是一旦用dlopen()加载,符号的地址为0x7ffff6ba1238 。 如果,一旦加载,我手动修补库符号到正确的地址,然后一切正常(否则,库SEGFAULT)。 为什么“绝对地址”被修改? 如何避免它? 更新: 我反驳下面的答复的技术相关性,甚至更多的是“更新”: 让–defsym在PIC库/可执行文件中定义重定位的符号是没有意义的(除了污染没有任何可用function的二进制文件之外,它不起任何作用)。 因此,PIC共享库或PIC可执行文件中唯一相关的–defsym的用法是定义一个( 非重定位的 )“绝对地址”。 顺便说一下,如果你懒得阅读手册页,这就是–defsym的官方目的: “在输出文件中创build一个全局符号,其中包含由expression式给出的absolute address 。” 至多,这是一个Linux链接器deffect这将是微不足道的修复。 对于那些不能等待拒绝人员来实现(并修复)他们的错误的人来说,解决的办法是在二进制映像被不良链接器加载之后修补重定位表。 然后,–defsym在PIC库/可执行文件中变得有用,在我看来这是一个值得欢迎的进展。

抑制共享库的编译时链接

我正在整合一个DRM库,因为安全原因,这个DRM库不能在代码库中保留。 DRM库在运行时只会在安全目标设备上处于清除状态,因此只能在运行时进行链接。 这给编译时链接带来了一个问题。 例如,如果我正在创build依赖DRM库libDrm.so的my_library.so,那么如果我简单地从构build中删除libDrm.so,则“ld:can not find -lDrm”gcc -fPIC -shared -o my_library.so my_library.c -L。 -lDrm 我知道dynamic加载libDrm.so的符号是一个解决scheme,但我不想编写代码在开发的这个阶段做dynamic加载。 我正在寻找快速和肮脏的东西。 我基本上想告诉LD忽略在编译时libDrm.so不能被find的事实,因为LD在运行时能够find它。 我怎样才能做到这一点? 我没有看到LD在编译时需要libDrm.so的原因,如果它在运行时可用,所以我希望LD足够灵活以允许这样做。 我目前正在考虑链接从stubs编译的libDrm.so版本,以使构build成功完成。 在运行时,从真正的实现中创build的libDrm.so版本将被链接到。 任何人都知道一个深奥的链接器选项,我可以使用LD来告诉LD延迟所有有关libDrm.so的链接操作,直到运行时?

编译和链接Debian 64位上的32位应用程序

我目前正在试图编译和链接我的Debian 64位上的32位应用程序,但在链接时失败。 我正在使用(在我的Makefile中)编译的命令是: gcc -Os -m32 -Wall -g -c $< -o $@ 这似乎工作。 然后我用下面的命令链接: gcc -m32 -lcurses $^ -o $@ 这会失败,并提供以下错误: /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libcurses.so when searching for -lcurses /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libcurses.a when searching for -lcurses /usr/bin/ld: skipping incompatible /usr/lib/libcurses.so when searching for -lcurses /usr/bin/ld: skipping incompatible /usr/lib/libcurses.a when searching for -lcurses /usr/bin/ld: cannot […]

在静态库中可用的二进制variables消失

我有提到的问题。 我在一个静态库中创build了一个对象,当我在静态库上运行nm时,它就在那里,但是当我把这个库链接到一个二进制文件并运行nm它就消失了。 我知道这个问题之前已经被问过了,但我找不到任何答案。 对于我来说,能够在二进制文件中保留该variables是非常重要的,因为我们正在试图对二进制文件中的静态库进行版本检查。 请帮忙。 谢谢。 示例代码如下: test.h #ifndef TEST_H #define TEST_H class Test { public: Test(); }; extern Test* gpTest; #endif TEST.CPP #include "test.h" Test::Test() { gpTest = this; } Test test; main.cpp中 #include "test.h" #include <iostream> using namespace std; Test* gpTest = NULL; int main() { return 0; } build立 g++ -c test.cpp […]

如何设置二进制文件的RunPath?

有无数的线程描述什么是RPATH , RUNPATH和LD_LIBRARY_PATH以及它们如何交互以解决库的位置。 要设置RPATH使用gcc选项: -Wl,-rpath,/path/to/dir 要设置LD_LIBRARY_PATH,请使用: export LD_LIBRARY_PATH= <path of lib> 我找不到如何设置RUNPATH ?

将一个共享库静态链接到我的共享库

我正在努力一些有关链接我正在进行的项目的一些选项: 我正在尝试创build一个与其他两个库链接的共享库。 (让我们称他们为libfoo.so和libbar.so ) 我的输出库必须是一个共享库,我想静态链接libfoo.so到结果库,但libbar.so应链接为一个dynamic库。 ( libbar.so应该在每台机器上都可用, libfoo.so不可用,我不希望用户安装它/将其与我的二进制文件一起发送。) 我怎么能把这个存档? 我目前的构build指令是这样的: c++ -Wall -shared -c -o src/lib.o src/lib.cpp c++ -Wall -shared -o lib.ndll src/lib.o -lfoo -lbar 我的防守:我不是AC / C ++专家,所以如果这个问题看起来很愚蠢,那么对不起。

在x86_64 Linux中重新部署一个2GB以上的程序的链接器错误?

我有一个用户程序,通常编译有一个入口点在0x400460 ,我不得不重新定位入口点在2GB的Linux内加载的共享库开始。 例如linux-vdso.so.1 => (0x00007fff109cd000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcd195e6000) /lib64/ld-linux-x86-64.so.2 (0x00007fcd199af000) 我正在使用gcc命令行参数-Wl,-Ttext=0x80000000来指定.text segemnt的开始地址。 问题是,当我给这个参数超过2GB的地址时,我得到一个链接器错误是: gcc test.c -ggdb -Wl,-Ttext=0x80000000 -o test1 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 10 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 11 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index […]

链接到所有链接到一个共同的静态库的多个共享库

假设你有2个共享库lib1.so和lib2.so,它们都有静态链接到它们的libcommon.a。 如果您要dynamic链接lib1.so和lib2.so,编译器是否会抱怨模糊的符号引用? 或者是编译器足够聪明,知道libcommon符号在lib1和lib2之间共享,并允许您dynamic链接两者?

如何避免多重定义链接错误?

除了将hello()函数移动到另一个源(.cpp)文件或重命名该函数。 有没有其他的方法来避免链接错误? staticLibA.h #ifndef _STATIC_LIBA_HEADER #define _STATIC_LIBA_HEADER int hello(void); int hello_staticLibA_only(void); #endif staticLibA.cpp #include "staticLibA.h" int hello(void) { printf("\nI'm in staticLibA\n"); return 0; } int hello_staticLibA_only(void) { printf("\nstaticLibA: hello_staticLibA_only\n"); return 0; } 输出: g++ -c -Wall -fPIC -m32 -o staticLibA.o staticLibA.cpp ar -cvq ../libstaticLibA.a staticLibA.o a – staticLibA.o staticLibB.h #ifndef _STATIC_LIBB_HEADER #define _STATIC_LIBB_HEADER int hello(void); […]