精华内容
下载资源
问答
  • Linux下动态库so查找与函数列表

    千次阅读 2018-05-01 16:33:42
    查看某个soLinux(Ubuntu)系统的路径 ldconfig -p | grep libc.so.6 ldconfig -p | grep xxx.so 查看某个 so导出函数列表 # 如果输出符号T,则函数正常导出 # 如果输出符号U,则函数为定义 ...

    Linux下动态库so查找与函数列表

    • 查看某个so在Linux(Ubuntu)系统下的路径
    ldconfig -p | grep libc.so.6
    ldconfig -p | grep xxx.so
    
    • 查看某个 so导出函数列表
    # 如果输出符号T,则函数正常导出
    # 如果输出符号U,则函数为定义
    nm -D xxx.so
    # 或
    objdump -tT xxx.so
    

    Linux系列

    展开全文
  • Linux查看动态库.so导出函数列表

    万次阅读 2018-06-12 11:29:21
    有两种方式:1.使用objdump命令。例如:objdump -tT xxx....该选项仅对于动态库有意义)得到的结果以T开头的就是导出函数实例:自己生成一个只包含test_b函数动态库libtest.so使用awk命令筛选出第二列为-T的行...

    有两种方式:

    1.使用objdump命令。

    例如:objdump -tT xxx.so

    2.使用nm命令(个人觉得使用nm方式查看更方便。)

    例如 nm -D xxx.so

    (-D或-dynamic选项表示:显示动态符号。该选项仅对于动态库有意义)

    得到的结果中以T开头的就是导出函数


    实例:

    自己生成一个只包含test_b函数的动态库libtest.so


    使用awk命令筛选出第二列为-T的行


    展开全文
  • linux下so动态库调用主程序函数

    千次阅读 2020-08-27 10:06:46
    今天无意间发现在linux下share object(dynamic library)函数竟然可以不通过回调的方式直接访问主程序函数,瞬间颠覆以前对于动态库的观念. 1、如代码所示libhi.so中有一个函数hello, 主程序main有一个...

     

    linux下动态库

    今天无意间发现在linux下share object(dynamic library)中的函数竟然可以不通过回调的方式直接访问主程序中的函数,瞬间颠覆以前对于动态库的观念.

    1、如下代码所示,ibhi.so中有一个函数hello, 主程序main中有一个函数hi_out, 那么在main中调用libhi.so中的hello时,hello会自动找到main程序中的hi_output函数地址, 然后进行调用.

    =================hi.c 编译为 libhi.so===========
    extern void hi_out();
    void hello(){
        hi_out();
        ...;
    }
    
    
    =================main.c 编译为 elf_lnk=============
    #include <stdio.h>
    
    void hi_out(){
        printf("hi out.\n");
    }
    
    extern void hello();    //语句1
    int main() {
        hello();            //语句2
    
        return 0;
    }

    利用命令gcc -shared -fPIC -o libhi.so hi.c     把hi.c源文件编译成libhi.so

    利用命令gcc main.c -L. -lhi -Wl,-rpath,. -o elf_lnk 把main.c和libhi.so一起编译链接,生成可执行文件(elf_lnk)指向动态库libhi.so

     

    在感叹linux下动态库强大的同时, 对于其实现机制也产生了好奇. 经过一番努力终于在《程序员的自我修养》中第7.6.2章找到答案.
    “动态链接器在完成基本自举后, 动态链接器将可执行文件和链接器本身的符号表都合并到一个符号表中, 我们可以称它为全局符号表(Global Symbol Table)…..当一个新的share object被装载进来的时侯, 它的符号表会被合并到全局符号表中”, 因此其实libhi.so在调用hello函数时实际上是从全局符号表中找到hi_out函数的地址并进行调用, 本质上libhi.so并不知道这个hi_out是属于另一个share object还是属于main程序中.

     

    2、但当我使用dlopen系列函数动态加载libhi.so时, 却总是加载失败提示找不到hi_out函数. 理论上静态加载与动态加载上的行为应该是一样的, 只不过静态加载时dlopen将会被隐式调用而已.

    代码如下,把上面的语句1和语句2删除,增加了一些dlopen的代码。

    利用命令gcc main.c -ldl -o elf_dl 编译成可执行文件elf_dl,运行时会报错 语句3的打印

    load dlopen(/root/libhi.so): /root/libhi.so: undefined symbol: hi_out
    =================hi.c 编译为 libhi.so===========
    extern void hi_out();
    void hello(){
        hi_out();
        ...;
    }
    
    
    =================main.c 编译为 elf_dl=============
    #include <stdio.h>
    #include <dlfcn.h>    //dlopen的头文件
    
    void hi_out(){
        printf("hi out.\n");
    }
    
    int main() {
        const char* pstr = "/root/libhi.so";
        void *library = dlopen(pstr, RTLD_NOW);    //如果用RTLD_LAZY,则会在语句4报错
        if (!library ) {
            printf("load dlopen(%s): %s\n", pstr, dlerror() );  //语句3,RTLD_NOW模式在这报错
            return -1;
        }
    
        void (*pfun) ();
        pfun = (void(*)()) dlsym(library, "hello");
        if (pfun){
            pfun();    //语句4
        }
    
        return 0;
    }

    在 ld手册 找到了答案, ld在生成可执行文件时, 默认只导出被其他动态库使用的符号. 因为是使用dlopen去动态加载libhi.so, 那么链接时ld并不知道可执行文件中的hi_out会被外部引用, 也就不会导出hi_out到动态符号表去. 当dlopen打开libhi.so时, 动态链接器在全局符号表中找不到hi_out符号, 理所当然就报错了.

    要解决这个问题只要给链接器加上参数-E将主程序中所有全局符号放到动态符号表中即可, 由于生成可执行文件一般都是gcc直接生成, 因此可以使用gcc -Wl,-E来将-E参数传给ld来完成创建一个可以被动态链接的可执行文件.

     

    编译主程序: gcc main.c -Wl,-E -ldl -o elf_dl  , 编译成可执行文件elf_dl,运行ok。

    或者把-Wl,-E换成 -rdynamic,可以实现一眼的效果,用来通知链接器,把全部符号加入到动态符号表中(目的是dlopen的so库可以通过使用这些符号)

     

    3、后记

    可以用nm,或者ldd来查看libhi.so里面的未定义符号

    [root]# nm libhi.so | grep hi_out
                U hi_out
    
    [root]# ldd -r libhi.so
        ....省略
    undefined symbol: hi_out    (./libhi.so)
    展开全文
  • 一个例子,记录一下,以后会用到 strings libdrv.so | grep BrdReInitAllGMPU

    一个例子,记录一下,以后会用到

    strings libdrv.so | grep BrdReInitAllGMPU

     

    展开全文
  • 在项目,需要对已有的动态库封装成JNI库,但在java程序测试发现有某些动态库一直加载不成功,...所需功能大概是:我需要在动态库so中获取得到当前动态库所在的路径,然后可以将此路径设置为工作路径,最后再设置...
  • linux查看静态库和动态库有哪些函数

    千次阅读 2020-01-17 14:29:52
    查看静态库中有哪些函数 https://blog.csdn.net/tao546377318/article/details/51727696 nm -g -C --defined-only xxxx.a
  • 查看动态链接的所有函数: ...在动态链接库中查找某一个函数是否存在以及函数入口地址: 假设动态链接为yourLib.so函数名字为yourFunction,则如下: nm -D yourLib.so |grep -w yourFunction
  • 编译命令 解决办法: -L. -l库名 要放到.c之后 ...折腾了一个晚上,网上找了半天,才在一个评论里找到的,往其他新手少走弯路 ...另外可以用nm工具查看.so .o文件的符号表 要导出的函数名 ...
  • Linux查看.so文件中函数

    千次阅读 2020-02-16 16:13:14
    nm -D libX.so 参数介绍: -a或--debug-syms:显示调试符号。 -B:等同于--format=bsd,用来兼容MIPS的nm。 -C或--demangle:将低级符号名解码(demangle)成用户级名字。这样可以使得C++函数名具有可读性。 -D或--...
  • linux环境的链接分为静态链接(.a)和动态链接(.so库),其作用是把C程序编译好做成一种可执行链接文件,主程序文件调用这些程序的函数接口是可以使用aso库,在主程序只需要include含有库中提供...
  • 查看动态链接库中函数和参数

    千次阅读 2019-06-04 16:29:10
    [如何查看Dll里的函数](https: https://jingyan.baidu.com/article/f79b7cb3a4036b9144023e3c.html https://blog.csdn.net/chinabinlang/article/details/7698459
  • 测试发现,在动态库中调用,主程序的函数,会有如下报错: symbol lookup error: /usr/lib/***so: undefined symbol: ****** 解决方法: 编译时,加上参数: -Wl,-E 博客园上的一遍博客写的很好,学习到很多。 ...
  • linux查看.so导出函数

    千次阅读 2017-11-18 15:19:58
    方法一 nm -D *.so 方法二 objdump -tT *.so
  • 隐藏动态库so中的符号(函数名)

    千次阅读 2018-11-29 19:35:50
    隐藏动态库so中的符号(函数名) 正常的lib库生成 1.c int func1() { return 1; } 2.c extern int func1(void); int func2() { return func1(); } 编译成动态库 libfunc.so: gcc -shared -fPIC -o libfunc.so 1....
  • linux nm工具 查看动态库导出函数

    千次阅读 2019-08-16 14:19:07
    查看动态导出函数 方法一 nm-D**.so 但这样能看到所有的导出,乱七八糟的很多,筛选用: nm **.so | grep XX 方法二 objdump-tT**.so 查看静态导出函数 nm -g --defined-only libxxx.a nm 命令介绍 ...
  • linux下so编写 - 动态库-类

    千次阅读 2019-02-13 18:01:13
    linux下so编写 - 动态库-类 文章目录linux下so编写 - 动态库-类引言代码 引言 加载类有点困难,因为我们需要类的一个实例,而不仅仅是一个函数指针。我们无法通过new来创建类的实例,因为类是在动态库中定义的而...
  • Linux:解决应用程序/动态库中与加载的其他动态库函数 重名问题 ...在复现的过程,gdb调试发现,在我们的动态库A.so中有个接口叫F_Recg(),我们调用的底层还有个用的别人提供的动态库B.so,其中有个函数也叫F_Re...
  • linux下查看so文件的函数列表

    万次阅读 2017-02-21 09:13:30
    nm -D XXX.so objdump -tT XXX.so
  • 示例如下: #include <stdio.h> #include <stdlib.h> #include <dlfcn.h> #include <signal.h> #include <...#define SO_FILE "test.so" typedef int (*FUN_CALL)(int, ...
  • C++ linux动态库so导出及使用

    千次阅读 2019-04-03 15:11:36
    C++ linux动态库so导出log4cpp linux编译安装使用宏定义进行区分windows & linux存在不兼容的函数sprint_s snprintf控制linux动态库的导出函数 第一次尝试导出linux动态库,遇到的问题做个记录。 log4cpp ...
  • 大型嵌入式软件开发,静态库和动态库同时使用,部分.c文件和.c++文件由于bin超大会编译成动态库,在编译链接时无任何错误,但是实际运行时经常发现某些函数符号找不到,由于动态链接库只有可执行程序真正运行时才会...
  • 如何查看linux动态库中包含哪些函数

    千次阅读 2016-08-28 16:18:16
    1、方法1 nm *.so 2、方法2 readelf -a *.soPS:readelf Options are: -a --all Equivalent to: -h -l -S -s -r -d -V -A -I -h --file-header Display the ELF file header -l --program-header
  • 在/etc/ld.so.conf.d/创建xxx.conf,在文本加入.so所在路径,如:/usr/xxx等等,然后使用相应ldconfig命令使之生效。 将.so所在路径添加为PATH环境变量。 在编译命令使用-Wl,-rpath=./参数,并将相应.so拷贝...
  • Linux下动态库文件的扩展名为\".so\"(Shared Object)。按照约定,所有动态库文件名的形式是libname.so(可能在名字加入版本号)。这样,线程函数库被称作libthread.so。静态库的文件名形式是libname.a。共享...
  • 4. Linux下通过JNA技术实现JAVA程序调用so库函数的实例。 4.1 开发环境 4.2 so库的生成 4.2.1 编写文件sayhello.h 4.2.2 编写文件sayhello.c 4.2.3 编写编译命令文件64cmd.sh和32cmd.sh 4.2.4 编译生成so库 ...
  • Linux 动态库调用回调函数

    千次阅读 2019-05-27 11:54:09
    Linux环境下动态库调用回调函数是非常常见的。一般调用的访问mysql、sqlite及以一些数据库,都会调用对应数据库提供的动态库接口,这种方式特别方便,一直以来对于这种回调理解不是特别透,只是一味地调用,现在写篇...
  • 一、Linux生成动态库 两步生成动态库 1.gcc -fPIC -c test.c 2.gcc -shared -o libtest.so test.o 一步生成动态库 gcc -shared -fPCI -o libtest.so test.c 二、Linux生成静态库 1. 生成目标文件 gcc -c ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,692
精华内容 21,076
关键字:

linux下如何查看动态库so中的函数

linux 订阅