Articles of 链接器

在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); […]

如何find像libfoo.so.1这样的库名称的完整文件path?

没有实现链接器或使用ldd ,我怎样才能find一个图书馆的完整path? 在Linux上有没有标准的库? (POSIX也许?) 在明知使用libGL.so.1的文件上使用ldd和grep ,它看起来像: $ ldd /usr/bin/glxinfo | grep libGL libGL.so.1 => /usr/lib/libGL.so.1 (0x00007f34ff796000) 给定一个像libGL.so.1这样的库名称,我怎样才能find完整path/usr/lib/libGL.so.1 ? 。 最好接受一个查找32位和64位库的选项。 如果没有图书馆这样做,是否有一个程序来做到这一点? 就像find-library-path libGL.so.1 。 locate libGL.so.1命令不计数。 我不想实际上使用dlopen加载库,或者如果它执行库中的代码。

为什么LD_PRELOAD似乎不能用wc写入

我正在玩LD_PRELOAD拦截libc调用,似乎写入调用不被拦截与wc,虽然它似乎与猫一起工作。 下面显示了一个精简版的问题。 RedHat Linux 2.6.9-42.ELsmp Makefile文件 writelib: gcc -Wall -rdynamic -fPIC -c write.c gcc -shared -Wl,-soname,libwrite.so -Wl,-export-dynamic -o libwrite.so write.o -ldl 为write.c: #include <stdio.h> #include <string.h> #ifndef __USE_GNU #define __USE_GNU #define __USE_GNU_DEFINED #endif #include <dlfcn.h> #ifdef __USE_GNU_DEFINED #undef __USE_GNU #undef __USE_GNU_DEFINED #endif #include <unistd.h> #include <stdlib.h> static ssize_t (*libc_write)(int fd, const void *buf, size_t len); […]

核心实用程序缺less__vdso_time?

我build立了最新的glibc,现在我在使用ls或cat类的coreutils函数或vim类的函数时遇到了一些麻烦。 我的错误是 -bash-4.0$ cat cat: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument 和我build立,glibc没有错误与以下configuration ../glibc/configure –prefix=/home/ex/uid377/glibbuilt 在旧版本,如2.14,运行的实用程序导致分段错误。 -bash-4.0$ ./pwd ./pwd: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./pwd) -bash-4.0$ LD_LIBRARY_PATH=/home/ex/uid377/glibc/lib/:${LD_LIBRARY_PATH} -bash-4.0$ ./pwd Segmentation fault (core dumped) 编辑内核版本 -bash-4.0$ uname -r 2.6.32.26-175.fc12.x86_64

如何在centos6上分发c ++ 11共享库

我有一个C ++ 11库( https://github.com/matiu2/cdnalizer )。 我想分发到centos6和ubuntu12.04 LTS。 它在Ubuntu 13.10和Gentoo上愉快地编译。 我尝试尽可能多的静态编译,但它仍然取决于centos没有的glibc: matiu@matiu-laptop:~/projects/cdnalizer/build/src/apache$ readelf -d mod_cdnalizer.so | grep NEED 0x0000000000000001 (NEEDED) Shared library: [libapr-1.so.0] 0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6] 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000006ffffffe (VERNEED) 0xd520 0x000000006fffffff (VERNEEDNUM) 3 build造线: /usr/bin/g++ -fPIC -I/usr/local/include -I/usr/include -I/usr/include/x86_64-linux-gnu -I/usr/include/x86_64-linux-gnu/c++/4.8 -Wall -Wextra -g -shared -Wl,-soname,mod_cdnalizer.so […]

如何通过系统库强制使用本地共享库?

我怎样才能强制使用本地库在Linux系统库? 我明确地将我的可执行文件链接到我的项目/ lib目录中的一些.so文件,例如(../lib/libluajit.so)。 在gdb下运行我的可执行文件或使用ldd显示它仍然使用系统libluajit-5.1.so.2 然后我将LD_LIBRARY_PATH设置到我的项目/ lib目录并导出它,然后运行我的可执行文件。 不知何故,它仍然拿起系统库(由gdb和ldd确认) 我想知道这怎么可能,以及我能做些什么来强制它在我的project / lib目录中使用本地的libluajit.so。

dlopen vs连接开销

假设我有一个库–foo.so。 在构build我的二进制文件(需要这个库)时,我可以(1)链接foo.so,或者(2)在程序源代码中,dlopen这个库,然后调用这个库提供的函数 当我从库中调用函数时,(1)和(2)之间是否有任何性能差异? 请注意,我知道会有不同的初始化特性(如dlopen的开销,第一次使用符号的开销等),但是在稳定状态下,两种select都同样快,还是更快? 谢谢。

设置我的lib为LD_PRELOAD使一些进程产生加载器错误

当我尝试运行脚本时出现以下错误,我只有以下的执行权限: uname: symbol lookup error: /home/dumindara/random/sotest/a.out: undefined symbol: dlsym 这是在将LD_PRELOAD环境variables设置为/home/dumindara/random/sotest/a.out 。 a.out有一个testingmalloc函数,并在内部调用dlsym 。 运行ls时我没有遇到这个问题。 大多数进程都会出现这个错误。 为什么发生这种情况,我能做些什么来使它工作?