私は非常に基本的な質問があります。その後、FOO()が呼び出されます、プロセス実行スタックでC実行スタック - ローカル変数割り当て
#include <stdio.h>
void foo(void) {
char *s = "StackOverflow";
printf("%s\n", s);
}
int main(void) {
foo();
}
、メインがスタックにロードされます: はこのスニペットを取ることができます。 "StackOverflow"のメモリはどこに割り当てられていますか? printfが呼び出されたときに、 "%s \ n"のメモリがどこに割り当てられますか?今、私が持っている他の質問は、以下のコードを検討している
:
は、次のコードを考えてみましょう
#include <stdio.h>
int x;
int abc = 100;
void foo(void) {
char *s = "stackoverflow";
printf("%s\n", s);
}
int main(void) {
foo();
}
をので、私はobjdumpは-s -jは.bssに行う場合。アウト、私は初期化されていないセグメントが表示され、objdump -s -j .data a.outを行う場合、私は初期化されたセグメント(abc = 100)rtを参照する必要がありますか?この前提に間違いはありますか?
でも、私は次の出力を得る:
テスト> objdumpの-s -j .bssのa.outの のa.out:ファイル形式ELF32-i386の
テスト> objdumpの-s -j .dataセクションa.outの
のa.out:ファイル形式ELF32-i386のセクション.dataセクションの
内容: 804954c 00000000 3c960408 00000000 64000000 .... < ....... D ...
私はここで何が欠けていますか?
おかげで、誰も再び
Linux(と同様の)システムでは、バイナリ上で '-j -drootata'を' objdump'して見ることができます。また、 'gcc'を使うと' gcc'が 'puts()'の呼び出しにそのパターンを最適化するので、あなたは "%s \ n"を見つけられません。 – FatalError
@FatalErrorあなたのコメントと同じ時間にobjdumpコマンドを書きました:) 'puts'の良い点私はそれを追加する答えを編集します。 – ouah