代码之家  ›  专栏  ›  技术社区  ›  atline

如何知道应用程序在运行时链接了哪个?

  •  0
  • atline  · 技术社区  · 7 年前

    caculate.c 在文件夹中 correct_so & wrong_so so 这个 app

    libcac.so 它是用 将由使用 main.c

    ~/tt$ tree
    .
    ├── correct_so
    │   ├── caculate.c
    │   ├── caculate.h
    │   └── libcac.so
    ├── main
    ├── main.c
    └── wrong_so
        ├── caculate.c
        ├── caculate.h
        └── libcac.so
    

    #include "caculate.h"
    
    int add(int a, int b)
    {
        return (a + b);
    }
    

    #include "caculate.h"
    
    int add(int a, int b)
    {
        return (a + b) * 2;
    }
    

    计算h: (同 & 错了,所以 )

    #ifndef _CACULATE_H__INCLUDE_
    #define _CACULATE_H__INCLUDE_
    int add(int a, int b);
    #endif
    

    #include <stdio.h>
    #include <unistd.h>
    #include "caculate.h"
    
    int main()
    {
        int a = 1;
        int b = 2;
        while (1)
        {
            printf("%d + %d = %d\n", a, b, add(a, b));
            sleep(1);
        }
        return 0;
    }
    

    我的问题是:

    我做了以下步骤,细节参考下一个日志:

    • 编译出2个不同的 在两个不同的文件夹中: 错了,所以
    • 编译 main libcac.so公司
    • 使用错误的so路径 错了,所以 LD_LIBRARY_PATH ,你可以说 1 + 2 = 6 . 现在我可以用 ldd main ,显示 libcac.so => wrong_so/libcac.so , ldd a predefined order /lib, /usr/lib, LD_LIBRARY_PATH etc
    • 如果以后 export LD_LIBRARY_PATH=correct_so 到正确的一个, ldd公司 设置。所以呢 在这帮不了我。

    总而言之,我如何知道应用程序是否以正确的方式运行,所以当它在运行时,如果没有打印日志?同时让我们假设 LD\库\路径

    然后,我可以告诉其他人:哦,系统中有两个版本的库,你只是用一个问题版本运行应用程序,所以应用程序肯定有运行时问题。

    ~/tt$ cd correct_so/
    ~/tt/correct_so$ ls
    caculate.c  caculate.h  libcac.so
    ~/tt/correct_so$ gcc -shared -fPIC caculate.c -o libcac.so
    ~/tt/correct_so$ cd ..
    ~/tt$ cd wrong_so/
    ~/tt/wrong_so$ gcc -shared -fPIC caculate.c -o libcac.so
    ~/tt/wrong_so$ cd ..
    ~/tt$ gcc main.c -o main -I correct_so -L correct_so -lcac
    ~/tt$ ldd main
            linux-vdso.so.1 =>  (0x00007fffd3dfe000)
            libcac.so => correct_so/libcac.so (0x00007f1a70b7c000)
            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1a7079f000)
            /lib64/ld-linux-x86-64.so.2 (0x00007f1a70d80000)
    ~/tt$ export LD_LIBRARY_PATH=wrong_so && ./main
    1 + 2 = 6
    1 + 2 = 6
    1 + 2 = 6
    ^Z
    [1]+  Stopped                 ./main
    ~/tt$ ldd main
            linux-vdso.so.1 =>  (0x00007fff1abd9000)
            libcac.so => wrong_so/libcac.so (0x00007fdb5523c000)
            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdb54e5f000)
            /lib64/ld-linux-x86-64.so.2 (0x00007fdb55440000)
    ~/tt$ export LD_LIBRARY_PATH=correct_so
    ~/tt$ ldd main
            linux-vdso.so.1 =>  (0x00007fffa11fe000)
            libcac.so => correct_so/libcac.so (0x00007ffeda6b6000)
            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f82f80bc000)
            /lib64/ld-linux-x86-64.so.2 (0x00007f82f849b000)
    ~/tt$ fg
    ./main
    1 + 2 = 6
    ^C
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   shaocong    7 年前
    ps -ef | grep main // find your process ID
    lsof -p ${pid}
    here is my output
    main    6839 scliang  cwd    DIR   8,17     4096 226363625 /home/scliang/so
    main    6839 scliang  rtd    DIR    8,2     4096        96 /
    main    6839 scliang  txt    REG   8,17     8528 226363626 /home/scliang/so/main
    main    6839 scliang  mem    REG    8,2  2173512      2139 /usr/lib64/libc-2.17.so
    main    6839 scliang  mem    REG   8,17     7864 226493228 /home/scliang/so/wrong_so/libcac.so
    main    6839 scliang  mem    REG    8,2   164240      2132 /usr/lib64/ld-2.17.so
    main    6839 scliang    0u   CHR  136,0      0t0         3 /dev/pts/0
    main    6839 scliang    1u   CHR  136,0      0t0         3 /dev/pts/0
    main    6839 scliang    2u   CHR  136,0      0t0         3 /dev/pts/0
    
    推荐文章