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

时间:2018-10-25 02:48:28

标签: c linux shared-libraries ldd

背景:

我在Linux上具有以下代码结构,并且在文件夹caculate.ccorrect_so中有wrong_so的两个不同版本。我想知道so在启动时已链接到哪个app

libcac.so使用的由caculate.c构建的

main.c

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

correct_so / caculate.c:

#include "caculate.h"

int add(int a, int b)
{
    return (a + b);
}

wrong_so / caculate.c:

#include "caculate.h"

int add(int a, int b)
{
    return (a + b) * 2;
}

caculate.h:(与correct_sowrong_so相同)

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

main.c:

#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个不同的文件夹中编译出2个不同的libcac.socorrect_sowrong_so
  • 编译出main应用并链接到libcac.so
  • 使用错误的路径,因此wrong_so的路径LD_LIBRARY_PATH可以说1 + 2 = 6的结果。现在,我可以使用ldd main,显示libcac.so => wrong_so/libcac.soldd通过a predefined order查找事物,例如/lib, /usr/lib, LD_LIBRARY_PATH etc
  • 如果稍后再export LD_LIBRARY_PATH=correct_so到正确的版本,ldd只会显示应用程序链接到正确的版本,但是实际上,当应用程序启动时,它会找到错误的版本,因为错误的{{1} }集。因此LD_LIBRARY_PATH在这里无济于事。

总而言之,我如何才能知道某个应用程序是否运行正确,因此在运行时是否未打印任何日志?同时,我们假设ldd会在应用运行时被其他人更改,甚至可能没有系统中的历史记录。

然后,我可以告诉其他人:哦,系统中有2个版本的库,您只需运行带有问题版本的应用程序,因此该应用程序肯定存在运行时问题。

我的实验可以显示我的问题:

LD_LIBRARY_PATH

1 个答案:

答案 0 :(得分:1)

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