2016-06-29 3 views
3

gettimeofdayのようなvDSOコールをキャプチャする(つまり、観測する)方法があるかどうかは、straceです。straceのvDSOをキャプチャ

また、linux-vdso.so.1(フラグまたはenv変数)をロードせずにバイナリを実行する方法はありますか?

最後に、linux-vdso.so.1アドレスを補助ベクトルから削除してからexecve私のプログラムを削除するプログラムを作成するとどうなりますか?誰もそれを試したことがありますか?

答えて

4

straceの代わりにltraceを使用して、vDSO経由で実装されたシステムコールのコールをキャプチャできます。これは、vDSOを介して実装されたシステムコールの呼び出しが「通常の」システムコールとは異なって動作し、straceシステムコールをトレースするためのメソッドがvDSO実装のシステムコールでは機能しないためです。 straceの詳細については、this blog post I wrote about straceをご覧ください。 ltraceの詳細については、this other blog post I wrote about ltraceをご覧ください。

いいえ、ロードしないでバイナリを実行することはできませんlinux-vdso.so.1。少なくとも、Ubuntu上のlibcの私のバージョンは正確ではありません。 libc/eglibc/etcの新しいバージョンがこれを機能として追加している可能性は確かですが、それはほとんどありそうにありません。理由については、次の回答を参照してください。

補助ベクトルからアドレスを削除すると、バイナリがクラッシュする可能性があります。 libcにはpiece of codeがあり、最初にvDSO ELFオブジェクトを処理しようとしますが、失敗した場合は、ハードコードされたvsyscallアドレスに戻ります。これを避ける唯一の方法は、vDSOを無効にしてglibcをコンパイルした場合です。

しかし、本当に本当にvDSOを使いたくない場合は、別の回避策があります。 glibc's syscall functionを使用し、gettimeofdayのシステムコール番号を渡すことができます。これによりglibcはvDSOの代わりにカーネル経由でgettimeofdayを呼び出します。

これを説明するサンプルプログラムが含まれています。私のsyscall blog postを読むことで、システムコールの仕組みについてもっと読むことができます。 strace -ttTf ./test 2>&1 | grep gettimeofdaygcc -o test test.cとstraceのと

#include <sys/time.h> 
#include <stdio.h> 

#define _GNU_SOURCE 
#include <unistd.h> 
#include <sys/syscall.h> 

int 
main(int argc, char *argv[]) { 
    struct timeval tv; 
    syscall(SYS_gettimeofday, &tv); 

    return 0; 
} 

コンパイル:

09:57:32.651876 gettimeofday({1467305852, 651888}, {420, 140735905220705}) = 0 <0.000006>

関連する問題