背景:
我在Linux上具有以下代码结构,并且在文件夹caculate.c
和correct_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_so
和wrong_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;
}
我的问题:
我执行以下步骤,详细信息请参阅下一个日志:
libcac.so
:correct_so
和wrong_so
main
应用并链接到libcac.so
wrong_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
只会显示应用程序链接到正确的版本,但是实际上,当应用程序启动时,它会找到错误的版本,因为错误的{{1} }集。因此LD_LIBRARY_PATH
在这里无济于事。总而言之,我如何才能知道某个应用程序是否运行正确,因此在运行时是否未打印任何日志?同时,我们假设ldd
会在应用运行时被其他人更改,甚至可能没有系统中的历史记录。
然后,我可以告诉其他人:哦,系统中有2个版本的库,您只需运行带有问题版本的应用程序,因此该应用程序肯定存在运行时问题。
我的实验可以显示我的问题:
LD_LIBRARY_PATH
答案 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