Как узнать, какое приложение связало приложение во время выполнения?
Фон:
У меня есть следующая структура кода на 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;
}
Мой вопрос:
Я делаю следующие шаги, подробно относится к следующему журналу:
- скомпилировать 2 разных
libcac.so
в 2 разных папках: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
просто покажет ссылку приложения на правильную версию, но на самом деле, когда приложение запускается, оно находит неправильную версию, потому что неправильноLD_LIBRARY_PATH
задавать. Такldd
не помогает мне здесь.
Подводя итог, как я могу узнать, правильно ли запущено приложение, поэтому, когда оно находится во время выполнения, если журнал не печатался? А пока давайте предположим LD_LIBRARY_PATH
будут изменены другими при запуске приложения и, возможно, даже без записи истории в системе.
Затем я могу сказать другим: "О, в системе есть 2 версии библиотеки, вы просто запускаете приложение с проблемной версией, поэтому у приложения наверняка есть проблема во время выполнения".
Мой эксперимент, который может показать мою проблему:
~/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 ответ
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