2011-02-09 2 views

답변

4

음, 다음과 같이 할 수 있습니다.

쓰기이 :

#include <stdio.h> 
#include <sys/file.h> 
int main() { 
     return dup(0) 
} 

그것을 컴파일

gcc -o systest -g3 -O0 systest.c 

가 덤프 :

objdump -d systest 

는 "에 보면 내가"DUP "의 조립 덤프를 얻고 싶었다 말 메인 "참조 :

400478:  55      push %rbp 
    400479:  48 89 e5    mov %rsp,%rbp 
    40047c:  bf 00 00 00 00   mov $0x0,%edi 
    400481:  b8 00 00 00 00   mov $0x0,%eax 
    400486:  e8 1d ff ff ff   callq 4003a8 <[email protected]> 
    40048b:  c9      leaveq 
    40048c:  c3      retq 
    40048d:  90      nop 
    40048e:  90      nop 
    40048f:  90      nop 
그래서 "DUP @의 PLT"보고

나는 참조 :

00000000004003a8 <[email protected]>: 
    4003a8:  ff 25 7a 04 20 00  jmpq *2098298(%rip)  # 600828 <_GLOBAL_OFFSET_TABLE_+0x20> 
    4003ae:  68 01 00 00 00   pushq $0x1 
    4003b3:  e9 d0 ff ff ff   jmpq 400388 <_init+0x18> 

그래서 그것은 내가 모든 콜 벡터를 가지고 가정 것 "전역 옵셋 테이블"로 전화를 만들고있다. 다른 포스트와 마찬가지로 커널 소스 (또는 표준 라이브러리 소스?)에서 자세한 내용을 확인하십시오.

+2

PLT 및 GOT는 동적 링커 구조입니다. PLT 또는 프로 시저 연결 테이블에는 동적 함수에 대한 간접 점프 (GOT를 통한)와 dl_runtime_resolve() 로의 대체 점프가 포함됩니다. GOT (Global Offset Table)에는 이미 해결 된 기능의 주소 또는 간접 점프 후 PLT의 명령이 포함되어 있으므로 대체 점프로 리디렉션 할 수 있습니다. – ninjalj

0

리눅스 시스템 호출을 이해하려면 코드를 검색하십시오.

중요 파일은 다음과 같습니다

/include/linux/syscalls.h (지원되는 모든 시스템이 리눅스에서 호출)

/arch/arm/kernel/entry-common.S (시스템 레지스터 (C)의 레벨에서 시스템 호출)

/arch/arm/kernel/calls.S (시스템 호출 번호)

/arch/arm/include/asm/unistd.h 구현 (어드레스 모든)

참고 : 시스템 호출 테이블은 단지 system.map에서 해결 될 수 있습니다.