Как узнать, какое приложение связало приложение во время выполнения? - PullRequest
0 голосов
/ 25 октября 2018

Фон:

У меня следующая структура кода в linux, и в папке correct_so & wrong_so есть две разные версии caculate.c,Я хочу знать, какой 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);
}

неправильный_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;
}

Myвопрос:

Я делаю следующие шаги, подробности относятся к следующему журналу:

  • скомпилировать 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 Ответ

0 голосов
/ 25 октября 2018
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
...