특정 프로세스에 대해 런타임에 로드되는 공유 라이브러리를 확인하는 방법
실행 중인 프로세스가 어떤 라이브러리를 사용하고 있는지 확인할 수 있는 방법이 있습니까?
좀 더 구체적으로 말하면, 프로그램이 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
'sourcecode' 카테고리의 다른 글
Nuxt 구성 요소를 사용하여 vuex getter 메서드에 매개 변수를 전달하는 방법은 무엇입니까?(3개의 도트 표기법을 유지하면서) (0) | 2022.07.28 |
---|---|
Nuxt.js가 RouteMiddleware에서 Vuex를 사용할 수 없음 (0) | 2022.07.28 |
봄에 여러 @RequestMapping 주석을 사용하는 방법 (0) | 2022.07.28 |
Clang은 x * 1.0을 최적화하지만 x + 0.0은 최적화하지 않는 이유는 무엇입니까? (0) | 2022.07.28 |
Java에서 'ArrayList'를 'String[]'로 변환 (0) | 2022.07.28 |