首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

动态库的制作与两种使用方式你掌握了吗?

使用动态库 常见有两种使用方式,一种是加载链接,另一种是使用时链接。...来源:公众号【编程珠玑】 个人博客:https://www.yanbinghu.com 未经授权禁止以任何形式转载 加载链接 加载链接在代码中不需要做额外的动作,像使用静态库一样使用即可。...-ltest 其中-L指定从当前目录下寻找动态库libtest.so,否则会找不到。.../main I am test;hello,编程珠玑 导入LD_LIBRARY_PATH环境变量,指定库搜索路径,使得main程序能够找到libtest.so。...这种方式有以下好处: 编译无需链接需要的动态库,我们注意到第二种方式编译没有加-ltest 如果程序的某些场景不需要动态库的函数,那么它就不会去加载该动态库 再看动态库 如果我们修改test.c的代码

1.5K50

dlsym用法_DLSS模式

dlsym dlsym,dlvsym – 从一个动态链接库或者可执行文件中获取到符号地址。...详解 函数dlsym()的第一个参数是一个指向已经加载的动态目标的句柄,这个句柄可以是dlopen()函数返回的。 其中symbol参数是一个以null结尾的符号名。...返回值是这个符号加载到内存中的地址。如果这个符号 在指定的目标 或者 在由dlopen(3)装载指定的目标自动装载的其他共享目标中都没有找到,dlsym()返回NULL指针。...(dlsym在这些动态目标中执行广度优先搜索)。 由于符号的值本身可能实际就是NULL,因此,返回的NULL不能直接用来判断是否出错!...返回值 成功,这些函数返回跟symbol关联的地址。失败,返回NULL;错误原因可以通过dlerror(3)来判断。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

94720
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    掌握死锁检测:策略和最佳实践

    2.1、dlsym()函数获取共享对象或可执行文件中符号的地址。...“句柄”以及以空结尾的符号名,并返回该符号加载到内存中的地址。...如果在指定对象或加载对象dlopen()自动加载的任何共享对象中找不到符号dlsym()将返回NULL。(dlsym()执行的搜索是通过这些共享对象的依赖关系树进行的广度优先搜索。)...由于符号的值实际上可能是NULL(因此,dlsym()的NULL返回值不必指示错误),因此测试错误的正确方法是调用dlerror()以清除任何旧的错误条件,然后调用dlsym。...函数dlvsym()的作用与dlsym()相同,但使用版本字符串作为附加参数。返回值:成功,这些函数返回与符号关联的地址。失败,返回NULL;可以使用dlerror()诊断错误的原因。

    9010

    静态链接库和动态链接库的区别

    快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。...函数dlerror:原型为: const char *dlerror(void);当动态链接库操作函数执行失败,dlerror可以返回出错信息,返回值为NULL表示操作函数执行成功。...2) RTLD_NOW : 表明在dlopen返回前就解决所有未定义的符号,一旦未解决,dlopen将返回错误。dlopen调用失败,将返回NULL值,否则返回的是操作句柄。...函数dlsym : 取函数执行地址原型为: void *dlsym(void *handle, char *symbol);dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址...6、查看库中的符号1、使用nm命令可以打印出库中涉及到的所有符号

    8.2K21

    Android 5.0 到 Android 6.0 + 的深坑之一 之 .so 动态库的适配

    现在我用一句话说白它,就是:不同链接方式,dlopen会打开指定的系统中(手机中)或提供的动态库,并使用 dlsym 获取符号地址,也就是说,如果,在此时的手机中如果找不到,那么就会出问题,一般和 API...主要是两种,静态链接,动态链接:     动态链接,是指在生成可执行文件不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。...插件加载形式有:     1)dlopen     2)dlsym     3)dlclose   dlopen打开指定的系统中(手机中)动态库。...并使用 dlsym 获取符号地址,也就是说,如果,在此时的手机中如果找不到,那么就会出问题,一般和 API 有关系。...APP_STL,重新编译 .so ,如果,我说如果你没有源码,那么悲剧了,要么等他们解决,要么采用第一种,建议尝试,APP_STL := gnustl_shared,   这种方式,对于所需要的外部动态链接函数、符号

    1.9K100

    一种Android App在Native层动态加载so库的方案

    这三个函数均在头文件中定义,它们的作用分别是:dlopen()打开一个动态链接库,返回一个动态链接库的句柄;dlsym()根据动态链接库句柄和符号名,返回动态链接库内的符号地址,这个地址既可以是变量指针...这样调用方直接引用被加载so库里面的函数,就有可能因为参数类型错误而出错。...这是因为C语言直接把函数名当做符号名,dlsym直接用符号名就能加载相对应的目标库内的函数,但是由于C++有类和类成员函数的概念,符号名的生成采用了”name managing”的方式,把函数名、类定义...、类的成员函数采用复杂的方式将其转换为只能让机器读懂的符号,所以在C++,函数名和其对应的符号名不是直接对等的。...子类定义在被动态加载的so库中) extern "C" void destroy_SubClass(SubClass* p) { delete p; } //动态加载

    7.3K60

    听GPT 讲Rust源代码--srctools(20)

    这些枚举类型的变体用于在模拟 dlsym 函数处理不同的情况。...Shim是指在Mirai Rust解释器中模拟操作系统和底层库函数的功能,用于在编译模拟运行时的行为。dlsym函数是一个动态链接库函数,用于在运行时通过名称查找某个符号的地址。.../dlsym.rs 该文件主要是为了定义在Android平台上使用dlsym函数所需要的shim函数和数据结构。...register_with_dlsym:将符号名称及其对应的函数指针注册到dlsym的模拟执行环境中。 Dlsym enum: 该enum定义了使用dlsym函数可能出现的不同情况。...DlsymNotFound: 表示在模拟执行期间找不到给定符号名称对应的函数指针。 Other: 表示在模拟执行期间发生了其他未知的情况。

    13910

    研读《程序员的自我修养—链接、装载与库》

    静态链接 静态链接:链接器在链接将静态库合并到可执行程序。...动态库也需要参与链接的过程,否则找不到符号的信息; so保存了完整的符号信息,链接器解析符号时会获取这些信息,用于判断一个符号是否为动态符号; .dll、.so 是常见的动态链接库; 共享对象的最终装载地址在编译是不确定的...,根据装载的地址空间的空闲情况,动态分配一块足够大小的虚拟地址空间给响应的共享对象。...dlfcn.h的方法 dlopen打开动态链接库; dlerror返回错误; dlsym获取函数名或者变量名; dlclose关闭动态库; Objective-C的方法 NSClassFromString...fprintf(stderr, "%s\n", dlerror()); return ; } dlerror(); FOO_FUNC func = dlsym

    1.6K70

    【图片+代码】:Linux 动态链接过程中的【重定位】底层原理

    在代码段中引用的外部符号,可以在数据段中增加一个跳板:让代码段先引用数据段中的内容,然后在重定位,把外部符号的地址填写到数据段中对应的位置,不就解决这个矛盾了吗?!...Windows 中的动态库的显性的导出和导入标识,更能体现这个概念(__declspec(dllexport), __declspec(dllimport))。...然后在第二遍扫描的时候,查看每个目标文件中需要重定位的符号,然后在全局符号表中查找该符号被安排在什么地址,然后把这个地址填写到引用的地方,这就是静态链接的重定位。...既然提到了符号表,就来看看这 3 个ELF文件中的动态符号表信息: 动态链接库中保护两个符号表:.dynsym(动态符号表: 表示模块中符号的导出、导入关系) 和 .symtab(符号表: 表示模块中的所有符号...划重点: liba.so的代码段中引用了libb.so中的符号b,既然b的地址需要在重定位才能确定,那么就在数据段中开辟一块空间(称作:GOT表),重定位把b的地址填写到GOT表中。

    2.3K11

    深入Android源码系列(二) HOOK技术大作战

    = get_remote_addr(xxx,dlsym) 去查找dlsym方法在远程进程的地址 找到"hook_init"方法的地址,后面紧跟着就是调用远端的hook_init 方法 hook_init...相比较本进程的hook,跨进程主要解决的是我们每个方法的调用,都是需要找到远程进程的具体方法的地址,主要麻烦点就在这里,同时GOT是为了解决so里面的地址修正,对于导入的外部符号,系统默认是未赋值的,我们要做的就是找到未赋值的对应方法的加载位置在这里塞入我们的...但我们坚信,此方案是可行的,于是阅读代码,调试,终于定位到出错原因,修改后,测试通过。...hook方法地址 这里原理为:在pid的进程上面,从map表里面找到目标库,拿到基地址,然后使用ELF格式解析,将目标库的文件头拿到,解析里面的.got节,去匹配里面的每个地址(.got存储了所有导入符号真实地址...替换这里面的printf为my_printf 我们简单说下/system/bin/target的运行过程,系统将/system/bin/target加载进入内存,对于里面的printf方法(具体就是导入符号

    1.3K50

    StackOverflow上87万访问量的问题:什么是“找不到符号”?

    "; System.out.println(str.length); // 找不到符号,变量 length 4)忘记导入类了 在使用第三方类库的时候,切记要先导入类。...StringUtils.upperCase("abcd");// 找不到符号,类 StringUtils 不过,IDEA 中可以设置类自动导入,来避免这个错误。 ? 。。。。。。...03、如何修复“找不到符号”错误 一般来说,修复“找不到符号”的错误很简单,要么根据 IDE 的提示在编写代码的时候直接修复;要么根据运行后输出的堆栈日志顺藤摸瓜。 ?...比如上图中提醒我们 35 行代码出错了,找不到变量 j,那么就意味着我们需要给变量 j 一个类型声明即可。...类名和方法名都相同,但包名不同,方法的参数不同,在使用的时候就容易造成“找不到符号”。

    1.5K41

    深度解密Android中基于pltgot的hook实现原理

    为了表示动态链接这些模块之间的符号导入导出关系,ELF有一个叫做动态符号表(Dynamic Symbol Table)的段用来保存这些信息。...4.3、重定位 共享库需要重定位的主要原因是导入符号的存在。...动态链接下,无论是可执行文件或共享对象,一旦它依赖于其他共享对象,也就是说有导入符号(比如fwrite函数),那么它的代码或数据中就会有对于导入符号的引用。...在编译这些导入符号的地址未知,在运行时才确定,所以需要在运行时将这些导入符号的引用修正,即需要重定位。...Q:我在共享库中通过dlopen、dlsym的方式调用系统导入函数,这中方式可以被hook住吗?

    3.5K20

    iOS编译原理

    ; 将外部导入符号,放到重定位符号表; 最后生成一个或多个.o目标文件; 使用xcrun命令,生成汇编文件: xcrun clang -S main.m -o main.s 打开.s文件,摘取内容如下:...: undefined:表示在当前文件暂时找不到符号_NSLog; external:表示这个符号是外部可以访问的,对应表示文件私有的符号是non-external; 八、链接(Linking) 主要功能...symbols"; 另外,链接器在整理函数的符号调用关系,可以帮助我们理清那些函数没有被调用,并自动去除掉; 2.重定位 将变量名、函数名这些符号定义与一个内存位置关联起来; 因为只有通过了绑定,机器才知道需要操作什么内存地址...; 否则,我们就需要在写代码给每个指令设置好内存地址,不仅操作繁琐,而且容易引起出错; 3.合并目标文件 将多个.m文件编译产生的.o目标文件与其他Mach-O文件(如dylib、a、tbd),合成一个...但是这些符号都会被记录下来,在运行时再通过dlopen和dlsym动态链接绑定; 动态链接:作用于运行时,这样的优势在于:诸多类似UIKit这样的共享库将不必包含在每一个App包里。

    1.6K20

    VS2015 error LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 “int __cdecl invoke_main(void)”

    为了编译OpenCV的示例代码,然后搭建环境, 最后想直接运行示例demo,我在创建新工程的时候,直接创建了一个win32窗口项目,然后环境配置完成后,将opencv 的示例代码kalman.cpp直接导入到新建的...vs工程中进行编译,直接报错: 错误 LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 "int __cdecl invoke_main(void)" (?...E:\MyWork\VSProject\opencvDemo\opencvDemo\MSVCRTD.lib(exe_winmain.obj) 1 经过网上查找问题,终于找到原因,是因为c语言运行时找不到适当的程序入口函数...那么WinMain是入口函数,就比如我这里创建的“win32项目” 如果是dos控制台程序,那么main是入口函数,新建项目为“win32控制台应用程序” 而如果入口函数指定不当,很显然c语言运行时找不到配合函数...所以我这里出错的原因是我导入的kalman.cpp是一个dos控制台程序,但是我新建项目选择的是“win32项目”,这时候修改一下配置就可以了。

    1.2K10

    听GPT 讲Rust源代码--srctools(21)

    具体来说,该文件实现了与dlsym函数相关的功能。dlsym函数是一个在C语言中常用的函数,它可以通过字符串来解析动态库中的符号(函数或变量)。...这个trait提供了一些用于符号解析的方法。 Dlsym是一个枚举类型,它定义了不同类型的dlsym函数调用。...EvalContextExt 中的方法包括: dlsym_symbol:根据给定的符号名返回符号地址。 dlsym_all_symbols:返回所有加载的符号的名称和地址。...dlsym_function:根据给定的函数名返回函数地址。 dlsym:根据给定的符号名返回符号地址,底层实现使用了 dlsym_symbol 和 dlsym_function。...当Rust编译器在编译源代码,会生成一些调试相关的文件和信息,比如符号表、调试符号、DWARF信息等。

    15910

    Linux下库文件制作方法详解

    参数 含义 -c 激活预处理、编译和汇编,把程序做成目标文件(.o文件) -g 在编译的时候产生调试信息 -Wall 生成警告信息 -l 指定链接需要的动态库。...执行可执行程序 在执行可执行程序时,出现以下错误,说找不到库文件,在继续往下看之前大家想想这是为什么?...3.另外还可以在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig /etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库要检查的目录...动态加载需要用到系统API函数 接口 描述 dlopen 打开对象文件,可被程序访问 dlsym 获取执行了dlopen函数的对象文件中的符号的地址 dlerror 返回上一次出现的错误 dlclose...dlHandler) { printf("dlopen:%s\n", dlerror()); return 0; } Func = dlsym(

    2.1K30
    领券