dynamic-linking相关内容
我有mylib.c文件,该文件具有某些功能.我想将.c文件中的那些函数用作已编译的llvm代码中的外部函数.我在玩LLVM解释器(lli-4.0),不知道如何告诉lli使用我的.c文件中的函数? 解决方案 lli具有-load参数,因此您可以将C文件编译为动态库,然后只需 lli -load path-to-your-dynamic-library ....
..
我想修改linux内核. 我想使用文件kernel/panic.c中共享库(.so文件)中的函数. 不幸的是,我不知道如何编译它. 当我将其放入Makefile时,出现以下错误: ld: attempted static link of dynamic object. 是否可以将共享库文件放入Linux内核,还是需要重新编译我的库以获得目标文件. 解决方案 不
..
我真的想从高级代码->可执行文件中理解这些步骤.但是遇到了一些困难. 我写了一个空的int main() {} C文件,并试图通过objdump -d解密反汇编.这是怎么回事: 中的,设置对齐方式,将参数压入堆栈,调用__libc_start_main 在__libc_start_main中,要执行的第一行是jmp *0x8049658 但是,使用objdump -R检出重定位
..
我想在Linux上使用基于indt动态库的Qt 5应用程序.总之,脚本会将可执行文件和其他相关文件(包括lib文件夹中的所有必需.so文件)复制到所需的目标位置,并且调用gksudo的脚本将作为应用程序的调用者. 到现在为止,一切正常,直到我调用可执行脚本:该应用程序未运行.当我要求使用sudo运行时,它告诉我缺少库(Qt5SerialPort ...).在实际的可执行文件上运行ldd时,我
..
我遇到以下问题:我试图创建程序的可移植版本,因此将rpath设置为“".因此,所有库都使用相对文件路径进行链接.这确实适用于除一个库以外的所有库.由于某种原因,该程序仅在编译时链接到的特定位置上存在一个特定的库时才起作用.我自己写的那个,也把rpath设置为“.".因此,基本上,即使库与可执行文件的位置完全相同,该程序也将拒绝启动. 我已经证实只有一个库是问题所在,因为如果在测试计算机上的计算机
..
我知道动态链接器使用mmap()来加载库.我猜是内核将可执行文件及其.interp reter都加载到了相同的地址空间中,但是它如何确定位置呢?我注意到在禁用了ASLR的情况下,ld.so的加载地址是0x555555554000(在x86_64上)—该地址来自何处?我尝试按照do_execve()的代码路径进行操作,但是对我来说,它的影响太大了,以至于不会混淆为地狱. 解决方案 详细了解
..
ELF格式的.got和.got.plt节有什么区别? 解决方案 我先前的评论是正确的: 我认为.got用于与全局“变量"有关的重定位,而.got.plt是在解析过程绝对地址时与.plt一起起作用的辅助部分. 下面的示例使事情变得很清楚. 这些是我的32位i686-linux/lib/libm.so的重定位 Relocation section '.rel.dyn'
..
分析这个问题我发现了有关动态加载情况下弱符号解析行为的一些信息()在Linux上.现在,我正在寻找管理此规范. 让我们以为例.假设有一个程序a,该程序以该顺序动态加载库b.so和c.so.如果c.so依赖于其他两个库foo.so(实际上是该示例中的libgcc.so)和bar.so(实际上是libpthread.so),则通常可以使用bar.so导出的符号来满足foo.so.但是,如果b.s
..
我已经使用LSB SDK构建了一个测试ELF程序(请注意,我的问题并非特定于LSB ): $ /opt/lsb/bin/lsbcc tst.c $ ls -l a.out -rwxr-xr-x 1 math math 10791 2009-10-13 20:13 a.out $ file a.out a.out: ELF 64-bit LSB executable, x86-64, ve
..
我有一个项目,其中有一个静态库libhelper.a,另一个有我的实际共享库libtestlib.so.我的目标是将libhelper.a链接到libtestlib.so.在Linux/BSD上有可能吗?尝试创建测试程序时,出现以下错误: ./prog1:/usr/local/lib/libtestlib.so.1.0:未定义符号`` 我的猜测是,这是因为libhelper.a并未使用
..
我了解到您可以通过dlfcn.h使用动态链接器API.这是使用该API的代码示例 #include #include #include int x[2]={1,2}; int y[2]={3,4}; int z[2]; int main(){ void *handle; void(*addvec)(int *,int
..
我对Linux上的动态链接有疑问.请考虑以下ARM二进制文件的拆卸. 8300 : .... 8320: e28fc600 add ip, pc, #0, 12 8324: e28cca08 add ip, ip, #8, 20 ; 0x8000 8328: e5bcf344 ldr pc, [ip, #836]!
..
我正在尝试将此文件包含在我的项目中: http ://cairo.sourcearchive.com/documentation/1.9.4/backtrace-symbols_8c-source.html 但是它需要链接BFD.我同时安装了binutils和binutils-devel.我试过用-lbfd链接以及直接链接到/usr/lib64/libbfd.so和/usr/lib64/li
..
仍在努力理解可重定位目标文件中的重定位条目,假设我有一个简单的C程序: //main1.c void functionTest(); functionTest(){ ... } int main() { functionTest(); return 0; } 我的问题是: Q1.由于main1知道一切,因此main1.o的.rel.text或.rel.dat
..
我在MSVC2017中具有以下情形: 具有功能bool foo() 的静态库 一个动态链接库,链接到上面的静态库 使用显式运行时链接加载动态链接库并通过GetProcAddress 调用foo()的应用程序 在静态库中,foo()的定义如下: extern "C" __declspec(dllexport) bool foo() { return true;
..
我的main.rs看起来像 // #[link(name = "lib")] extern "C" { fn hello(); } fn main() { unsafe { hello(); } } 和lib.rs: #[no_mangle] pub fn hello() { println!("Hello, World!");
..
在linux上,我试图创建一个共享库libbar.so,该库嵌入了一个商业静态库(许可就可以了).商业库具有4个版本:libfoo-seq.a,libfoo-mt.a,libfoo-seq.so和libfoo-mt.so(它们都提供相同的符号,只是代码是顺序/多线程的,并且该库是静态/共享的).在这四个文件中,我希望我的代码始终使用顺序的foo库,因此在创建libbar.so时,我将目标文件和li
..
我了解到您可以: 将.DLL文件转换为 .DEF 文件,其中包括其导出文件 (编辑:这不适用于许多约定) 将 .DEF 文件转换为.LIB文件,您可以使用该文件链接到DLL 为什么(大多数)链接器仅在给定 .DEF文件而不是.LIB文件的情况下链接到DLL? 解决方案 最终,这里的答案是“因为没有人非常想要它,它并没有真正的帮助". DEF文件是为DLL创建导入库的输
..
Firebird 和 Boost 社区仅为其预构建的 xxx.dll 二进制文件提供 xxx.lib , 并且我正在将 MinGW-w64 v7.0.0 与 GCC v8.1.0 一起使用, 最后一个期望包含所有要链接的 xxx.dll 功能符号的 libxxx.a 文件. 对于 Boost ,我可以从 MinGW-w64 的源代码进行构建(尽管我仍然更喜欢使用预构建的,因为构建
..
如何以与具有SONAME冲突的库的两个现有版本兼容的方式链接二进制文件? 这两个版本不共享相同的SONAME前缀.一个是libcapi10.so.3,另一个是libcapi10.so.4. 我无法重新编译它们,因为我将它们获取为二进制文件,并且由于这些都是经过认证的密码库,因此我无法使用正确的SONAME请求新的库.当然,如果一个是libcap10.so.3另一个是libcap10.so.3.1,
..