특정 기능에 대한 코드가 포함된 SO 파일의 이름을 찾는 방법

특정 기능에 대한 코드가 포함된 SO 파일의 이름을 찾는 방법

저는 dotnet 핵심 프로젝트를 만들고 있으며 P/Invoke를 사용하여 일부 Linux 시스템 기능을 호출하고 싶습니다. 필요한 기능이 있는 .so 파일을 어떻게 찾을 수 있나요?

예를 들어. getpid를 사용하려면 다음 가져오기를 추가해야 합니다.

[DllImport("libc.so.6")]

네트워크 커넥터매뉴얼 페이지커넥터에서 수신된 데이터를 구문 분석하는 데에만 NLMSG_DATA를 사용하는 것이 좋으며 내 C# 코드에서 이 메서드를 호출하고 싶습니다. 가져올 so 파일을 찾는 방법은 무엇입니까?

답변1

GNU 시스템에서 어떤 동적 라이브러리가 어떤 기호를 내보내는지 확인하려면 다음을 시도해 보세요.

ldconfig -p |
  sed -n 's/.* => //p' |
  sort -u |
  xargs -d '\n' nm --defined-only -oDg |
  grep -w getpid

(첫 번째 근사치에서는 inode 수준에서 중복 항목을 제거하여 개선할 수 있습니다.)

nm플래그를 조정하고 검색할 파일 목록을 수집하는 방법을 조정해야 할 수도 있지만 정적 라이브러리, ELF 또는 기타 지원되는 개체를 사용하여 유사한 작업을 수행할 수 있습니다 .

그러나 이 경우 NLMSG_DATA모든 대문자는 C 전처리기 매크로일 가능성이 높습니다.

$ grep -r NLMSG_DATA /usr/include
/usr/include/linux/netlink.h:#define NLMSG_DATA(nlh)  ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))

C 헤더 파일에서 정의를 찾으려면, 또는 같은 grep일부 코드 색인 도구를 사용하고 전체 .ctagscscopegtags/usr/include

C 전처리기를 사용하여 확장할 수도 있습니다.

printf '%s\n' '#include <linux/netlink.h>' 'please_describe[NLMSG_DATA(nlh)]' |
  gcc -P -E -x c - | sed '/please_describe/,$!d'
please_describe[((void*)(((char*)nlh) + ((0) + ((int) ( ((sizeof(struct nlmsghdr))+4U -1) & ~(4U -1) )))))]

따라서 크기에 따라 입력 포인터에서 일정량만큼 포인터 오프셋을 반환합니다 struct nlmsghdr(C 컴파일러를 사용하거나 포인터를 사용하는 일부 객체의 기호를 디버깅하여 이를 결정할 수 있습니다 struct).

헤더는 소프트웨어를 실행하는 데 필요하지 않고 빌드하기만 하면 됩니다. 기본적으로 모든 라이브러리에 대해 헤더가 설치되지 않으므로 헤더를 가져오려면 일부 xxx-dev또는 패키지를 설치해야 할 수도 있습니다.xxx-devel

라이브러리 함수에 대한 매뉴얼 페이지(일부 커널 API이기 때문에 여기에는 실제로 적용되지 않음)가 있는 경우 헤더 파일도 있을 가능성이 높습니다. 매뉴얼 페이지에서 패키지로 이동한 다음 헤더와 라이브러리로 이동할 수 있습니다. 예를 들어 Debian 및 attr_setf이 함수의 파생물에서는 다음과 같습니다.

$ man -w attr_setf
/usr/share/man/man3/attr_set.3.gz
$ dpkg -S /usr/share/man/man3/attr_set.3.gz
libattr1-dev:amd64: /usr/share/man/man3/attr_set.3.gz
$ dpkg -L libattr1-dev | grep /include/
/usr/include/attr
/usr/include/attr/attributes.h
/usr/include/attr/error_context.h
/usr/include/attr/libattr.h
/usr/include/attr/xattr.h

라이브러리의 경우 패키지를 추측하거나 패키지가 런타임 패키지에 의존한다는 사실을 사용할 수 있습니다 libattr1.-dev

$ apt-cache show libattr1-dev | grep Depends
Depends: libc6-dev | libc-dev, libattr1 (= 1:2.4.47-2build1)
$ dpkg -L libattr1 | grep /lib/
/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu/libattr.so.1.1.0
/lib/x86_64-linux-gnu/libattr.so.1
$ nm -Dg /lib/x86_64-linux-gnu/libattr.so.1 | grep attr_setf
00000000000016e0 T attr_setf

매뉴얼 페이지는 없지만 존재한다는 것을 알고 있는 경우 다음에서 사용 가능한 패키지를 찾을 수 있습니다.

$ apt-file search -x 'man.*/attr_set\.\d'
libattr1-dev: /usr/share/man/man3/attr_set.3.gz
ncurses-doc: /usr/share/man/man3/attr_set.3ncurses.gz

관련 정보