2012-05-02 13 views
3

glibc私はそのコードを変更して使用できるようにダウンロードしました。だからちょうどそれを再生するために、printf stdio-commonglibcのprintfを「Can you see me?」に変更しました。私はのglibcをコンパイルしてからprintfのを使用してサンプルプログラムを実行するには、このglibcのディレクトリにのlibc.so とLD_PRELOADを使用し、その変更を行った後glibcの変更が動作しない

int 
__printf (const char *format, ...) 
{ 
    va_list arg; 
    int done; 

    va_start (arg, format); 
    done = vfprintf (stdout, "Can you see me?", arg); 
    va_end (arg); 

    return done; 
} 

。しかし、私はまだprintfの印刷が正常に表示されている、つまり私が行った変更は反映されていません。私はここで何をしていますか?

+0

"hello"などを印刷するように重複する行を変更します。あなたはva_listを2回処理していますが、それはうまくいかず、最初の呼び出しはそれを使い果たします。 –

+0

私はキャラクターの代わりにキャラクター+ 1を印刷することが以前にいくつか変更を加えましたが、それはあまり効果がありませんでした! – MetallicPriest

+0

'ldd。/ test-program'とは何ですか?また、プログラムを実行する前に 'export LD_DEBUG = files'を実行すると、有用な情報が得られます。 –

答えて

1

そのため、いくつかの理由があるかもしれません、最も簡単なのは、あなたが本当の形式の文字列を使用し、コンパイラがprintfからputsへの呼び出しを変更することです:

printf("hello\n"); 
// becomes: 
puts("hello"); 

は、パラメータを追加してみてください:

char ex = '!'; 
printf("Hello %c\n", ex); 
+0

まだ動作しません、objdumpでコードをチェックして、それは実際にputsではなくprintfを使用しています! – MetallicPriest

+0

@MichaelBurr - 私はそれを知らなかった。ありがとう! – MByD

+1

IIRC printf( "%s"、 "hello \ n")も内部的にputs( "hello \ n")に変換されます。 glibcのprintf()は非常に親切で、puts()はNULLをチェックして適切なものを出力し、segfaultは表示します。 – Dipstick

関連する問題