2011-02-09 10 views

答えて

4

このようなことができます。私は "DUP" の組立・ダンプを取得したいと言う:

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

それをコンパイルします:

gcc -o systest -g3 -O0 systest.c 

はそれをダンプします。

objdump -d systest 

はで見ると、「この

書き込みメイン "参照:

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(グローバルオフセットテーブル)には、既に解決された機能のアドレス、または間接ジャンプに続くPLTの命令が含まれているため、フォールバックジャンプにリダイレクトすることができます。 – ninjalj

2

私はあなたがこれをやりたいとは思わないです。システムコール処理は複雑です(http://www.ibm.com/developerworks/linux/library/l-system-calls/参照)。この質問に「linux」というタグが付いているので、ソースコードはkernel.orgからダウンロードできます(これはアセンブリコードよりもはるかに理解しやすくなります)。

+1

確かに、システムコールの実装はコードによって理解できます。 – shingaridavesh

0

Linuxシステムコールを理解するには、コードを参照してください。

重要なファイルは、次のとおりです。

/include/linux/syscalls.h(サポートされているすべてのシステムがLinuxで呼び出す)

/arch/arm/kernel/entry-common.S(レジスタ・レベルでシステム・コールの実装)

/arch/arm/kernel/calls.S(システムコール番号)

/arch/arm/include/asm/unistd.h(システムCのアドレスすべての)

注:システムコールテーブルは、のみのみsystem.mapから対処することができます。

関連する問題