vmlinux elff 주어진 구조물의 멤버에 대한 오프셋을 찾습니다.
문제
Linux 커널에서 사용되는 구조물의 멤버 변수의 오프셋을 찾아야합니다. 예를 들어, task_struct 유형 인 init_task의 경우 PID와 작업의 오프셋을 원합니다.
나는 이것에 대한 vmlinux 만 있습니다. 오픈 소스 커널 코드를 참조 할 수 있지만 빌드와 다를 수 있습니다.
소스없이 오프셋을 얻을 수 있습니까?
편집 : vmlinux는 ARM 용이며 대상 장치에서 항상 C 코드를 실행할 수는 없습니다.
해결책
구조의 크기와 레이아웃은 컴파일 된 객체 파일의 디버깅 정보에 있습니다 (컴파일하는 경우 -g
그리고하지 마십시오 strip
).
Pahole (일명 "poke-a-hole", 포장 된 dev-util/dwarves
Gentoo)에서)는 구조의 "구멍"에 대한 정보를 출력하기 위해 객체의 난쟁이 디버깅 정보를 읽습니다. 이는 좋은 출발점 일 수 있습니다.
다른 팁
6.47 오프셋
GCC는 C 및 C ++ A를 모두 구현하여 매크로 오프셋을 구현하기위한 구문 연장을 구현합니다.
primary:
"__builtin_offsetof" "(" typename "," offsetof_member_designator ")"
offsetof_member_designator:
identifier
| offsetof_member_designator "." identifier
| offsetof_member_designator "[" expr "]"
이 확장은 충분합니다
#define offsetof(type, member) __builtin_offsetof (type, member)
매크로 오프셋의 적절한 정의입니다. C ++에서 유형이 의존적 일 수 있습니다. 두 경우 모두 멤버는 단일 식별자 또는 일련의 멤버 액세스 및 배열 참조로 구성 될 수 있습니다.
ARM-ABI-GDB와 함께 또 다른 솔루션을 찾았습니다-인쇄 및 init_task 및 print & init_task.pid를 수행 할 수 있으며 차이는 오프셋입니다.
제휴하지 않습니다 StackOverflow