🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Q&A

1回答

1087閲覧

なぜオブジェクトファイルから実行形式へとリンクさせると.textセクションのコードが増えるのか?

kazuyakazuya

総合スコア193

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

0グッド

0クリップ

投稿2020/11/25 07:14

初歩的な内容化もしれませんがわからないので教えてください。

void function(void); void main(void){ void (*p)() = function; } void function(void){}

適当にコードを書きます。(ライブラリは一切使いません。)
static変数とか使っていないのでこれらすべての要素は.textセクションと呼ばれている領域に格納されるはず。
まずはオブジェクトファイルを生成してみます。
gcc -c -O0 -m32 project1.c
objdump -h project1.o

project1.o: file format pe-i386 Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000018 00000000 00000000 000000dc 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000000 00000000 00000000 00000000 2**2 ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 00000000 2**2 ALLOC 3 .rdata$zzz 0000002c 00000000 00000000 000000f4 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .eh_frame 00000058 00000000 00000000 00000120 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

.textセクションのサイズは18バイト
最初に書いたソースコードをそのまんまバイナリに直すと18バイトになるってことですね。

次はコンパイル&リンクをします。
gcc -O0 -m32 project1.c

a.exe: file format pei-i386 Sections: Idx Name Size VMA LMA File off Algn 0 .text 00002f14 00401000 00401000 00000400 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA 1 .data 00000018 00404000 00404000 00003400 2**2 CONTENTS, ALLOC, LOAD, DATA 2 .rdata 00000728 00405000 00405000 00003600 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 3 .eh_frame 00000b0c 00406000 00406000 00003e00 2**2 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .bss 00000074 00407000 00407000 00000000 2**2 ALLOC 5 .idata 000005d4 00408000 00408000 00004a00 2**2 CONTENTS, ALLOC, LOAD, DATA 6 .CRT 00000018 00409000 00409000 00005000 2**2 CONTENTS, ALLOC, LOAD, DATA 7 .tls 00000020 0040a000 0040a000 00005200 2**2 CONTENTS, ALLOC, LOAD, DATA 8 .debug_aranges 00000038 0040b000 0040b000 00005400 2**3 CONTENTS, READONLY, DEBUGGING 9 .debug_info 00001ecc 0040c000 0040c000 00005600 2**0 CONTENTS, READONLY, DEBUGGING 10 .debug_abbrev 00000149 0040e000 0040e000 00007600 2**0 CONTENTS, READONLY, DEBUGGING 11 .debug_line 000001c4 0040f000 0040f000 00007800 2**0 CONTENTS, READONLY, DEBUGGING 12 .debug_frame 00000038 00410000 00410000 00007a00 2**2 CONTENTS, READONLY, DEBUGGING 13 .debug_str 00000086 00411000 00411000 00007c00 2**0 CONTENTS, READONLY, DEBUGGING

.textセクションのサイズが00002f14まで増えました。

なぜ増えたのですか?

.textセクションには上記のソースコードをバイナリに直したデータ以外に何が入っているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

投稿2020/11/25 07:19

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2020/11/26 10:08

_start ↓ __libc_start_main ↓ main の順番で呼ばれるようですね。 まだ把握していないだけかもしれませんが 見た感じだけですとこのくらいの量のプログラムなら .textセクションのサイズが 00002f14までいくことはないように見えるのですがどうなのでしょう・・・?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問