2

glibcを変更したい。だから私はそれのバージョンをダウンロードし、コードにいくつかの変更を加えました。たとえば、に変更を加えましたmemset。ただし、LD_PRELOADを実行しない場合と比較して、(LD_PRELOADを使用して)コンパイルによって生成された.soファイルを使用しても違いは見られません。memsetはそのように動作します。どうしてこんなことに?コンパイラがmemsetをインライン化し、共有オブジェクトから何も使用していない可能性がありますか?わかりません。printfにも変更を加えましたが、それでも何もしませんでした。どうしてこんなことに。(テスト目的で)glibcを変更して、変更を確認するにはどうすればよいですか?

さらに、その関数の最初に導入してpthread_create(およびもちろんLD_PRELOAded libpthread.so)を変更しようとするとprintf( "pthread_create")、セグメンテーション違反が発生します。ここで何が起こっているのですか?また、glibcソースに変更を加えた後でlibc.soの違いを確認すると、生成されたバージョンに違いは見られません。ここで何が起きてるの。これは私を狂わせています!

4

1 に答える 1

4

GCCは、およびを含むいくつかの機能の組み込みバージョンを提供します。これらの関数のglibcの実装にはリンクしていません。memset()printf()

-fno-builtinこの動作を禁止するには、コンパイラオプションを渡してみてください。

于 2012-05-04T16:03:29.400 に答える