sourcecode

특정 프로세스에 대해 런타임에 로드되는 공유 라이브러리를 확인하는 방법

copyscript 2022. 7. 28. 23:43
반응형

특정 프로세스에 대해 런타임에 로드되는 공유 라이브러리를 확인하는 방법

실행 중인 프로세스가 어떤 라이브러리를 사용하고 있는지 확인할 수 있는 방법이 있습니까?

좀 더 구체적으로 말하면, 프로그램이 dlopen을 사용하여 일부 공유 라이브러리를 로드하는 경우 readelf 또는 ldd는 이를 표시하지 않습니다.실행 중인 프로세스에서 그 정보를 얻을 수 있습니까?만약 그렇다면, 어떻게?

다른 사람들은 올바른 길을 가고 있다.여기 몇 가지 방법이 있습니다.

cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq

또는 Strace를 사용하는 경우:

strace CMD.... 2>&1 | grep -E '^open(at)?\(.*\.so'

둘 다 공유 라이브러리의 경로 어딘가에 ".so"가 있다고 가정하지만 수정할 수 있습니다.첫 번째는 한 줄에 하나씩 라이브러리의 목록으로 꽤 예쁜 출력을 제공합니다.두 번째는 도서관이 열리면 계속 나열되기 때문에 좋습니다.

그리고 물론.lsof...

lsof -p NNNN | awk '{print $9}' | grep '\.so'

실제로 이 작업은 코드 내에서 다음과 같은 방법으로 수행할 수 있습니다.

#include <link.h>

using UnknownStruct = struct unknown_struct {
   void*  pointers[3];
   struct unknown_struct* ptr;
};
using LinkMap = struct link_map;

auto* handle = dlopen(NULL, RTLD_NOW);
auto* p = reinterpret_cast<UnknownStruct*>(handle)->ptr;
auto* map = reinterpret_cast<LinkMap*>(p->ptr);

while (map) {
  std::cout << map->l_name << std::endl;
  // do something with |map| like with handle, returned by |dlopen()|.
  map = map->l_next;
}

link_map구조에는 적어도 기본 주소와 절대 파일 이름이 포함되어 있습니다.이 구조물은 실제로 이 구조물에 의해dlopen()non-NULL first 인수를 사용합니다.자세한 것은, 여기를 참조해 주세요.

ltrace당신 친구인 것 같아요.

부터ltrace매뉴얼:

ltrace는 지정된 명령어를 종료할 때까지 실행하는 프로그램입니다.실행된 프로세스에 의해 호출된 다이내믹라이브러리 콜과 그 프로세스에 의해 수신된 신호를 대행 수신하여 기록합니다.또, 프로그램에 의해서 잘라진 시스템 콜의 대행 수신과 인쇄도 가능합니다.

       Its use is very similar to strace(1).

아마도요.lsof- Linux의 스위스 군용 나이프가 도움이 될까요?

편집: 실행,lsof -p <pid>에는 모든 종류의 유용한 정보가 표시됩니다.예를 들어 프로세스가 java인 경우 열려 있는 모든 jars가 표시됩니다.매우 쿨합니다.

Linux에서 프로그래밍 방식으로 이 작업을 수행할 수 있습니다.기능을 사용할 수 있습니다.

다음은 man 페이지에서 가져온 작은 예입니다.

#define _GNU_SOURCE
#include <link.h>
#include <stdlib.h>
#include <stdio.h>

static int
callback(struct dl_phdr_info *info, size_t size, void *data)
{
    int j;

   printf("name=%s (%d segments)\n", info->dlpi_name,
        info->dlpi_phnum);

   for (j = 0; j < info->dlpi_phnum; j++)
         printf("\t\t header %2d: address=%10p\n", j,
             (void *) (info->dlpi_addr + info->dlpi_phdr[j].p_vaddr));
    return 0;
}

int
main(int argc, char *argv[])
{
    dl_iterate_phdr(callback, NULL);

   exit(EXIT_SUCCESS);
}

Linux의 경우,/proc/<processid>/maps메모리에 매핑된 모든 파일의 목록이 포함되어 있습니다.이 목록은 로딩된 모든 파일을 포함해야 한다고 생각합니다.dlopen().

그럴 것이다strace열려 있는 라이브러리 파일을 추적하시겠습니까?

Solaris에는 pldd 명령어도 있습니다.

언급URL : https://stackoverflow.com/questions/5103443/how-to-check-what-shared-libraries-are-loaded-at-run-time-for-a-given-process

반응형