実行形式ファイルの情報はどこにあるかというと、先ほど確認したところオブジェクトファイルにあるようです。

しかし、オブジェクトファイルごとに情報は散らばっている状態。

実行形式ファイル(ELF形式)は、リンクのときにオブジェクトファイルから情報を収集しまとめる処理を実施しているように推測できます。

実はどのオブジェクトファイルからどんな情報を収集するかを示すファイルが存在し、それがリンカスクリプトといわれるもの。

Mafefile中ですとgccのオプションで-Tで指定されているld.scrというファイルになります。

リンカスクリプトをいい感じで説明しているサイトはこここれもいいかんじ。


リンカ・スクリプトをどんな感じで記述したかを確認。


/* OUTPUT_FORMAT("elf32-h8300") */
OUTPUT_ARCH(h8300h)
ENTRY("_start")

MEMORY
{
romall(rx) : o = 0x000000, l = 0x080000 /* 512KB */
vectors(r) : o = 0x000000, l = 0x000100 /* top of ROM */
rom(rx) : o = 0x000100, l = 0x07ff00

ramall(rwx) : o = 0xffbf20, l = 0x004000 /* 16KB */
data(rwx) : o = 0xfffc20, l = 0x000300
stack(rw) : o = 0xffff00, l = 0x000000 /* end of RAM */
}

SECTIONS
{
.vectors : {
vector.o(.data)
} > vectors

.text : {
_text_start = . ;
*(.text)
_etext = . ;
} > rom

.rodata : {
_rodata_start = . ;
*(.strings)
*(.rodata)
*(.rodata.*)
_erodata = . ;
} > rom

.data : {
_data_start = . ;
*(.data)
_edata = . ;
} > data AT> rom

.bss : {
_bss_start = . ;
*(.bss)
*(COMMON)
_ebss = . ;
} > data AT> rom

. = ALIGN(4);
_end = . ;

.stack : {
_stack = . ;
} > stack
}

■MEMORY
H8のメモリには『領域』が定義されていると以前に書きましたが、その定義はこちらで指定するものでMEMORYのなかに記述された内容がそうだということです。

少なくともROMやRAMのハード制約を十分に人が認識してあげて、メモリの『領域』を定義してあげているようです。

しかも、そこには領域をメモリ上のどのアドレスを領域とするかの数字レベルの記述もされています。

ROM/RAMの中でさらに細かく分けていて、ROM側ではvectorsとrom、RAM側ではdataとstackが定義されています。

なぜこのように細かく分類する必要があるかは今のところよくわかりません。

僕的にはハードの制約だけを考慮して、ROM領域RAM領域だけ定義してあげれば良いように思うのですが。。

CPUなどのハードの動きとか処理効率などの問題でいろいろメモリの使う領域を混在させないで分けて扱えれば有利なのかなぁ。stackとか名前ついているし。

とりあえずメモリに展開されたプログラムが有利に実行するためにメモリ上に設ける領域の設定をMEMORYの中の記述の『領域』という単位で扱うと記憶しておくことにしておきます。


■SECTION
以下の記述に注目してみます。
.vectors : {
vector.o(.data)
} > vectors

①『.vectors : {』の行はセクションを定義しています。
実効形式ファイルはいくつかのこれまた領域によって分類されているようですが、それをセクションと呼びました。とにかくMEMORYの領域の分類とは違うので別の観点で分類が必要のようです。

②『vector.o(.data)』の行は、vector.oのオブジェクトファイルの.dataセクションの内容を気にするという意味だそうです。

③『} > vectors』の行は、MEMORYのところで定義したvectors領域に{}で囲まれた内容を配置するという意味だそうです。


オブジェクトファイル中の.dataセクションがどうやって命名されてつくられるのかはよくわからないのですが、それが恐らくELFという形式なのでしょう。とりあえずこの観点は置いておきます。


で、注目すべきは『vector.o(.data)』の記述の意味するところです。
これはオブジェクトファイルの中身を取得している記述です。
この記述があるから実行形式ファイル中にオブジェクトファイルの内容が取り込めたのですね。
また、.dataセクションだけ取り出すということもしているようです。
以下はvector.oをreadelfで取り出したSection Headersの所なのですが[ 2]の.dataの部分です。
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 00000000 000034 000000 00 AX 0 0 1
[ 2] .data PROGBITS 00000000 000034 000100 00 WA 0 0 4


これは、③でどのメモリに情報を置くかを指定してあげないといけないわけですが、オブジェクトファイルの内容を全て置く訳にはいかない。なかにはRAMに配置したい変数などの情報もオブジェクトファイルに含まれています。そこで.dataセクションだけ持ってくるという記述をしているようです。


それと、セクションの意味についてもいろいろ推測。
少なくとも、MEMORYで定義されているものよりネーミングからしてより処理内容に関する論理的な内容の傾向があるかもしれないです。ただセクション単位で扱う内容はROMに配置すべきかRAMに配置すべきかを意識した情報の集まりになっているようですので、セクションの設計はROMとRAMの制約からは逃れられないようです。
※テーマの静的変数の読み書きの観点でおもしろい話があるのでそれは別途扱います


これによってオブジェクトファイルから(セクション単位で)情報が収集されている裏付けがとれたことになります。
しかし、このリンカスクリプトの役割はオブジェクトファイルからの情報収集だけに留まらないようです。(つづく)
さきほど、実行形式ファイルには、複数のソースファイルに分散して定義されているはずの関数や変数が1つにまとまって扱われている様子が見れました。

複数のソースファイルに記述されている内容をリンクして実行形式ファイルを作成しているからなわけですが、リンクの動きが明確にわからないので、せめてオブジェクトファイルでも眺めてみることにします。

そこでreadelfをオブジェクトファイルに食わせてみることもできるようなのでなにか発見がないか確認してみることにします。


①main.c

ELF Header:
Magic: 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, big endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Hitachi H8/300
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 496 (bytes into file)
Flags: 0x810000
Size of this header: 52 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 40 (bytes)
Number of section headers: 9
Section header string table index: 6

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 00000000 000034 000116 00 AX 0 0 2
[ 2] .rela.text RELA 00000000 000604 00021c 0c 7 1 4
[ 3] .data PROGBITS 00000000 00014a 000004 00 WA 0 0 2
[ 4] .bss NOBITS 00000000 00014e 000002 00 WA 0 0 2
[ 5] .rodata.str1.1 PROGBITS 00000000 00014e 000062 01 AMS 0 0 1
[ 6] .shstrtab STRTAB 00000000 0001b0 000040 00 0 0 1
[ 7] .symtab SYMTAB 00000000 000358 0001e0 10 8 11 4
[ 8] .strtab STRTAB 00000000 000538 0000ca 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no program headers in this file.

There is no dynamic segment in this file.

Relocation section '.rela.text' at offset 0x604 contains 45 entries:
Offset Info Type Symbol's Value Symbol's Name Addend
00000008 00000901 R_H8_DIR32 00000000 .LC0 + 0
0000000d 0000123e R_H8_DIR24R8 00000000 _puts + 0
00000014 0000113f R_H8_DIR32A16 00000000 _global_data + 0
0000001b 0000133e R_H8_DIR24R8 00000000 _putxval + 0
00000020 00000a01 R_H8_DIR32 0000000f .LC1 + 0
00000025 0000123e R_H8_DIR24R8 00000000 _puts + 0
0000002a 00000b01 R_H8_DIR32 00000011 .LC2 + 0
0000002f 0000123e R_H8_DIR24R8 00000000 _puts + 0
00000036 0000143f R_H8_DIR32A16 00000002 _global_bss + 0
0000003d 0000133e R_H8_DIR24R8 00000000 _putxval + 0
00000042 00000a01 R_H8_DIR32 0000000f .LC1 + 0
00000047 0000123e R_H8_DIR24R8 00000000 _puts + 0
0000004c 00000c01 R_H8_DIR32 00000020 .LC3 + 0
00000051 0000123e R_H8_DIR24R8 00000000 _puts + 0
00000058 0000053f R_H8_DIR32A16 00000002 _static_data + 0
0000005f 0000133e R_H8_DIR24R8 00000000 _putxval + 0
00000064 00000a01 R_H8_DIR32 0000000f .LC1 + 0
00000069 0000123e R_H8_DIR24R8 00000000 _puts + 0
0000006e 00000d01 R_H8_DIR32 0000002f .LC4 + 0
00000073 0000123e R_H8_DIR24R8 00000000 _puts + 0
0000007a 0000083f R_H8_DIR32A16 00000000 _static_bss + 0
00000081 0000133e R_H8_DIR24R8 00000000 _putxval + 0
00000086 00000a01 R_H8_DIR32 0000000f .LC1 + 0
0000008b 0000123e R_H8_DIR24R8 00000000 _puts + 0
0000009c 00001601 R_H8_DIR32 00000000 _edata + 0
000000a2 00001701 R_H8_DIR32 00000000 _data_start + 0
000000a8 00001801 R_H8_DIR32 00000000 _erodata + 0
000000ae 00001701 R_H8_DIR32 00000000 _data_start + 0
000000b3 0000193e R_H8_DIR24R8 00000000 _memcpy + 0
000000b8 00001a01 R_H8_DIR32 00000000 _ebss + 0
000000be 00001b01 R_H8_DIR32 00000000 _bss_start + 0
000000c6 00001b01 R_H8_DIR32 00000000 _bss_start + 0
000000cb 00001c3e R_H8_DIR24R8 00000000 _memset + 0
000000d3 00001d3e R_H8_DIR24R8 00000000 _serial_init + 0
000000d8 00000e01 R_H8_DIR32 0000003e .LC5 + 0
000000dd 0000123e R_H8_DIR24R8 00000000 _puts + 0
000000e1 0000073e R_H8_DIR24R8 00000000 _printval + 0
000000e6 00000f01 R_H8_DIR32 0000004c .LC6 + 0
000000eb 0000123e R_H8_DIR24R8 00000000 _puts + 0
000000f4 0000113f R_H8_DIR32A16 00000000 _global_data + 0
000000fc 0000143f R_H8_DIR32A16 00000002 _global_bss + 0
00000104 0000053f R_H8_DIR32A16 00000002 _static_data + 0
0000010c 0000083f R_H8_DIR32A16 00000000 _static_bss + 0
00000111 0000073e R_H8_DIR24R8 00000000 _printval + 0
00000115 00001020 R_H8_PCREL8 00000114 .L4 + 0

There are no unwind sections in this file.

Symbol table '.symtab' contains 30 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS main.c
2: 00000000 0 SECTION LOCAL DEFAULT 1
3: 00000000 0 SECTION LOCAL DEFAULT 3
4: 00000000 0 SECTION LOCAL DEFAULT 4
5: 00000002 2 OBJECT LOCAL DEFAULT 3 _static_data
6: 00000000 0 SECTION LOCAL DEFAULT 5
7: 00000000 148 NOTYPE LOCAL DEFAULT 1 _printval
8: 00000000 2 OBJECT LOCAL DEFAULT 4 _static_bss
9: 00000000 0 NOTYPE LOCAL DEFAULT 5 .LC0
10: 0000000f 0 NOTYPE LOCAL DEFAULT 5 .LC1
11: 00000011 0 NOTYPE LOCAL DEFAULT 5 .LC2
12: 00000020 0 NOTYPE LOCAL DEFAULT 5 .LC3
13: 0000002f 0 NOTYPE LOCAL DEFAULT 5 .LC4
14: 0000003e 0 NOTYPE LOCAL DEFAULT 5 .LC5
15: 0000004c 0 NOTYPE LOCAL DEFAULT 5 .LC6
16: 00000114 0 NOTYPE LOCAL DEFAULT 1 .L4
17: 00000000 2 OBJECT GLOBAL DEFAULT 3 _global_data
18: 00000000 0 NOTYPE GLOBAL DEFAULT UND _puts
19: 00000000 0 NOTYPE GLOBAL DEFAULT UND _putxval
20: 00000002 2 OBJECT GLOBAL DEFAULT COM _global_bss
21: 00000094 130 NOTYPE GLOBAL DEFAULT 1 _main
22: 00000000 0 NOTYPE GLOBAL DEFAULT UND _edata
23: 00000000 0 NOTYPE GLOBAL DEFAULT UND _data_start
24: 00000000 0 NOTYPE GLOBAL DEFAULT UND _erodata
25: 00000000 0 NOTYPE GLOBAL DEFAULT UND _memcpy
26: 00000000 0 NOTYPE GLOBAL DEFAULT UND _ebss
27: 00000000 0 NOTYPE GLOBAL DEFAULT UND _bss_start
28: 00000000 0 NOTYPE GLOBAL DEFAULT UND _memset
29: 00000000 0 NOTYPE GLOBAL DEFAULT UND _serial_init

No version information found in this file.



②serial.c

ELF Header:
Magic: 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, big endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Hitachi H8/300
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 292 (bytes into file)
Flags: 0x810000
Size of this header: 52 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 40 (bytes)
Number of section headers: 8
Section header string table index: 5

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 00000000 000034 0000b0 00 AX 0 0 2
[ 2] .rela.text RELA 00000000 000350 00003c 0c 6 1 4
[ 3] .data PROGBITS 00000000 0000e4 00000c 00 WA 0 0 4
[ 4] .bss NOBITS 00000000 0000f0 000000 00 WA 0 0 1
[ 5] .shstrtab STRTAB 00000000 0000f0 000031 00 0 0 1
[ 6] .symtab SYMTAB 00000000 000264 0000a0 10 7 7 4
[ 7] .strtab STRTAB 00000000 000304 00004a 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no program headers in this file.

There is no dynamic segment in this file.

Relocation section '.rela.text' at offset 0x350 contains 5 entries:
Offset Info Type Symbol's Value Symbol's Name Addend
00000012 00000501 R_H8_DIR32 00000000 _regs + 0
00000048 00000501 R_H8_DIR32 00000000 _regs + 0
0000007e 00000501 R_H8_DIR32 00000000 _regs + 0
00000085 0000083e R_H8_DIR24R8 00000036 _serial_is_send_enable + 0
0000008b 00000620 R_H8_PCREL8 00000082 .L4 + 0

There are no unwind sections in this file.

Symbol table '.symtab' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS serial.c
2: 00000000 0 SECTION LOCAL DEFAULT 1
3: 00000000 0 SECTION LOCAL DEFAULT 3
4: 00000000 0 SECTION LOCAL DEFAULT 4
5: 00000000 12 OBJECT LOCAL DEFAULT 3 _regs
6: 00000082 0 NOTYPE LOCAL DEFAULT 1 .L4
7: 00000000 54 NOTYPE GLOBAL DEFAULT 1 _serial_init
8: 00000036 36 NOTYPE GLOBAL DEFAULT 1 _serial_is_send_enable
9: 0000005a 86 NOTYPE GLOBAL DEFAULT 1 _serial_send_byte

No version information found in this file.




■実行形式ファイルと比較しての気付き

1.以下のセグメントは実行形式ファイルの中にはなかった。
[ 2] .rela.text RELA 00000000 000604 00021c 0c 7 1 4
[ 5] .rodata.str1.1 PROGBITS 00000000 00014e 000062 01 AMS 0 0 1

2.オブジェクトファイルにはprogram headersはない。OK.
There are no program headers in this file.
先術した通りロードできるファイルではないからのようです。

3.オブジェクトファイルにはRelocation sectionがあるぞ。
Offsetという用語から推測して実行形式ファイルでアドレスを付与するときの相対的な配置を示していそうだがなんか資料ないかな。

4.Symbol tableのアドレスは意味なさげ。
自分のところで定義した情報だけValueとSizeを出している模様。
変数と関数はそれぞれ独立して相対的な配置を表現しているようだ。
5: 00000000 12 OBJECT LOCAL DEFAULT 3 _regs
 ←★regs変数のValueは0
6: 00000082 0 NOTYPE LOCAL DEFAULT 1 .L4
7: 00000000 54 NOTYPE GLOBAL DEFAULT 1 _serial_init
←★serial_init関数のValueは0
←★0x0+54(0x36)=0x36
8: 00000036 36 NOTYPE GLOBAL DEFAULT 1 _serial_is_send_enable
 ←★0x36+36(0x24)=0x36=0x5a
9: 0000005a 86 NOTYPE GLOBAL DEFAULT 1 _serial_send_byte



他のソースファイルで定義したものに関してはシンボルを明示しているがValueとSizeは0になっている。
21: 00000094 130 NOTYPE GLOBAL DEFAULT 1 _main ←★自分で定義
22: 00000000 0 NOTYPE GLOBAL DEFAULT UND _edata ←★他で定義した変数(extern)
23: 00000000 0 NOTYPE GLOBAL DEFAULT UND _data_start
24: 00000000 0 NOTYPE GLOBAL DEFAULT UND _erodata
25: 00000000 0 NOTYPE GLOBAL DEFAULT UND _memcpy ←★他で定義した関数(extern)
26: 00000000 0 NOTYPE GLOBAL DEFAULT UND _ebss
27: 00000000 0 NOTYPE GLOBAL DEFAULT UND _bss_start
28: 00000000 0 NOTYPE GLOBAL DEFAULT UND _memset
29: 00000000 0 NOTYPE GLOBAL DEFAULT UND _serial_init



■Program Headersのところ
大きな観点でみると実行形式ファイルには「Program Headers」はありますが、オブジェクトファイルには「Program Headers」がありません。

5章のELFフォーマットの展開で明らかになり、重要なポイントになりますが、ここは実行形式ファイルをメモリ上に展開するローダという機能で使用されます。

ローダはプログラム実行時に、ここの「Program Headers」を参照しメモリ展開するようです。
セグメントという用語がキーワードになります。

それなので、オブジェクトファイルはメモリに情報を展開するためのファイルには対応していないことを示しています。

メモリに展開できないということはCPUで情報を読み取り実行できる情報ではないということを意味していてシステムを動かすためのファイルとしては不十分であることを示しているようです。
ここではELF形式を確認。
ELF形式のファイルを作るgccも無事インストールが終了できたので、ELF形式の実行ファイルを作成してreadelfコマンドを実行してみた。これをベースにコメントしてみる。


$readelf -a kzload.elf

ELF Header:
Magic: 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, big endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Hitachi H8/300
Version: 0x1
Entry point address: 0x100
Start of program headers: 52 (bytes into file)
Start of section headers: 1544 (bytes into file)
Flags: 0x810000
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 3
Size of section headers: 40 (bytes)
Number of section headers: 9
Section header string table index: 6

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .vectors PROGBITS 00000000 000094 000100 00 WA 0 0 4
[ 2] .text PROGBITS 00000100 000194 0003b0 00 AX 0 0 2
[ 3] .rodata PROGBITS 000004b0 000544 000071 01 AMS 0 0 1
[ 4] .data PROGBITS 00fffc20 0005b8 000010 00 WA 0 0 4
[ 5] .bss NOBITS 00fffc30 0005c8 000004 00 WA 0 0 2
[ 6] .shstrtab STRTAB 00000000 0005c8 00003d 00 0 0 1
[ 7] .symtab SYMTAB 00000000 000770 0004c0 10 8 30 4
[ 8] .strtab STRTAB 00000000 000c30 0001f9 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000094 0x00000000 0x00000000 0x00100 0x00100 RW 0x1
LOAD 0x000194 0x00000100 0x00000100 0x00421 0x00421 R E 0x1
LOAD 0x0005b8 0x00fffc20 0x00000521 0x00010 0x00014 RW 0x1

Section to Segment mapping:
Segment Sections...
00 .vectors
01 .text .rodata
02 .data .bss

There is no dynamic segment in this file.

There are no relocations in this file.

There are no unwind sections in this file.

Symbol table '.symtab' contains 76 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 SECTION LOCAL DEFAULT 1
2: 00000100 0 SECTION LOCAL DEFAULT 2
3: 000004b0 0 SECTION LOCAL DEFAULT 3
4: 00fffc20 0 SECTION LOCAL DEFAULT 4
5: 00fffc30 0 SECTION LOCAL DEFAULT 5
6: 00000000 0 FILE LOCAL DEFAULT ABS vector.c
7: 0000010a 0 NOTYPE LOCAL DEFAULT 2 .L11
8: 00000000 0 FILE LOCAL DEFAULT ABS main.c
9: 00fffc22 2 OBJECT LOCAL DEFAULT 4 _static_data
10: 0000010c 148 NOTYPE LOCAL DEFAULT 2 _printval
11: 00fffc30 2 OBJECT LOCAL DEFAULT 5 _static_bss
12: 00000220 0 NOTYPE LOCAL DEFAULT 2 .L4
13: 00000000 0 FILE LOCAL DEFAULT ABS lib.c
14: 00000236 0 NOTYPE LOCAL DEFAULT 2 .L7
15: 0000022a 0 NOTYPE LOCAL DEFAULT 2 .L8
16: 00000258 0 NOTYPE LOCAL DEFAULT 2 .L15
17: 0000024a 0 NOTYPE LOCAL DEFAULT 2 .L16
18: 00000292 0 NOTYPE LOCAL DEFAULT 2 .L26
19: 0000028a 0 NOTYPE LOCAL DEFAULT 2 .L21
20: 00000284 0 NOTYPE LOCAL DEFAULT 2 .L22
21: 00000294 0 NOTYPE LOCAL DEFAULT 2 .L17
22: 00000270 0 NOTYPE LOCAL DEFAULT 2 .L27
23: 000002b0 0 NOTYPE LOCAL DEFAULT 2 .L34
24: 000002a6 0 NOTYPE LOCAL DEFAULT 2 .L35
25: 000002ce 0 NOTYPE LOCAL DEFAULT 2 .L38
26: 000002c0 0 NOTYPE LOCAL DEFAULT 2 .L37
27: 000002e4 0 NOTYPE LOCAL DEFAULT 2 .L53
28: 00000300 0 NOTYPE LOCAL DEFAULT 2 .L50
29: 000002fa 0 NOTYPE LOCAL DEFAULT 2 .L45
30: 000002f4 0 NOTYPE LOCAL DEFAULT 2 .L46
31: 00000302 0 NOTYPE LOCAL DEFAULT 2 .L41
32: 000002dc 0 NOTYPE LOCAL DEFAULT 2 .L55
33: 00000332 0 NOTYPE LOCAL DEFAULT 2 .L57
34: 0000032c 0 NOTYPE LOCAL DEFAULT 2 .L60
35: 00000326 0 NOTYPE LOCAL DEFAULT 2 .L61
36: 00000340 0 NOTYPE LOCAL DEFAULT 2 .L56
37: 0000033a 0 NOTYPE LOCAL DEFAULT 2 .L59
38: 0000033e 0 NOTYPE LOCAL DEFAULT 2 .L58
39: 00000318 0 NOTYPE LOCAL DEFAULT 2 .L63
40: 00000364 0 NOTYPE LOCAL DEFAULT 2 .L65
41: 00000390 0 NOTYPE LOCAL DEFAULT 2 .L71
42: 00000384 0 NOTYPE LOCAL DEFAULT 2 .L72
43: 000003be 0 NOTYPE LOCAL DEFAULT 2 .L86
44: 000003e2 0 NOTYPE LOCAL DEFAULT 2 .L75
45: 00000000 0 FILE LOCAL DEFAULT ABS serial.c
46: 00fffc24 12 OBJECT LOCAL DEFAULT 4 _regs
47: 00000482 0 NOTYPE LOCAL DEFAULT 2 .L4
48: 000002d6 50 NOTYPE GLOBAL DEFAULT 2 _strcmp
49: 00fffc32 2 OBJECT GLOBAL DEFAULT 5 _global_bss
50: 00000000 256 OBJECT GLOBAL DEFAULT 1 _vectors
51: 0000034a 46 NOTYPE GLOBAL DEFAULT 2 _putc
52: 000004b0 0 NOTYPE GLOBAL DEFAULT 2 _etext
53: 00000378 36 NOTYPE GLOBAL DEFAULT 2 _puts
54: 00fffc30 0 NOTYPE GLOBAL DEFAULT 5 _bss_start
55: 00000100 0 NOTYPE GLOBAL DEFAULT 2 _text_start
56: 00000436 36 NOTYPE GLOBAL DEFAULT 2 _serial_is_send_enable
57: 00fffc34 0 NOTYPE GLOBAL DEFAULT 5 _ebss
58: 0000023c 40 NOTYPE GLOBAL DEFAULT 2 _memcpy
59: 00000222 26 NOTYPE GLOBAL DEFAULT 2 _memset
60: 00000100 0 NOTYPE GLOBAL DEFAULT 2 _start
61: 00fffc20 0 NOTYPE GLOBAL DEFAULT 4 _data_start
62: 00000400 54 NOTYPE GLOBAL DEFAULT 2 _serial_init
63: 0000039c 100 NOTYPE GLOBAL DEFAULT 2 _putxval
64: 000002b8 30 NOTYPE GLOBAL DEFAULT 2 _strcpy
65: 00fffc20 2 OBJECT GLOBAL DEFAULT 4 _global_data
66: 00000264 58 NOTYPE GLOBAL DEFAULT 2 _memcmp
67: 00000308 66 NOTYPE GLOBAL DEFAULT 2 _strncmp
68: 000004b0 0 NOTYPE GLOBAL DEFAULT 3 _rodata_start
69: 00fffc30 0 NOTYPE GLOBAL DEFAULT 4 _edata
70: 00fffc34 0 NOTYPE GLOBAL DEFAULT ABS _end
71: 0000029e 26 NOTYPE GLOBAL DEFAULT 2 _strlen
72: 0000045a 86 NOTYPE GLOBAL DEFAULT 2 _serial_send_byte
73: 00ffff00 0 NOTYPE GLOBAL DEFAULT 5 _stack
74: 000001a0 130 NOTYPE GLOBAL DEFAULT 2 _main
75: 00000521 0 NOTYPE GLOBAL DEFAULT 3 _erodata

No version information found in this file.





■メモリの領域とセクション
ここで注目すべきところは以下の内容である。
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .vectors PROGBITS 00000000 000094 000100 00 WA 0 0 4
[ 2] .text PROGBITS 00000100 000194 0003b0 00 AX 0 0 2
[ 3] .rodata PROGBITS 000004b0 000544 000071 01 AMS 0 0 1
[ 4] .data PROGBITS 00fffc20 0005b8 000010 00 WA 0 0 4
[ 5] .bss NOBITS 00fffc30 0005c8 000004 00 WA 0 0 2
[ 6] .shstrtab STRTAB 00000000 0005c8 00003d 00 0 0 1
[ 7] .symtab SYMTAB 00000000 000770 0004c0 10 8 30 4
[ 8] .strtab STRTAB 00000000 000c30 0001f9 00 0 0 1

ELF形式は、ファイルの内部をセクションという単位で区切って管理している。
実はこのセクションがメモリの領域と対応しているということだ。
対応を以下に示ておきます。

[ 2] .text…テキスト領域に置かれるべき情報
[ 4] .data…データ領域に置かれるべき情報
[ 5] .bss…BSS領域に置かれるべき情報

一方、[ 1]/[ 3]/[ 6]/[ 7]/[ 8]の他の領域はどこに置かれるべきなのか?
もしかしてメモリの領域というのは3領域だけでなく他にもあるのかなどいろいろ浮かんできますが、とりあえずわからないので置いておきます。

ちなみにどんなセクションがあるか把握して意味まで確認できそうなありがたいサイト発見、ここ


■関数や変数の配置
readelfは他にもいろいろと情報が出しているようですので、もう少し覗いてみることにします。
こんどはここに注目。

Symbol table '.symtab' contains 76 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 SECTION LOCAL DEFAULT 1
2: 00000100 0 SECTION LOCAL DEFAULT 2
3: 000004b0 0 SECTION LOCAL DEFAULT 3
4: 00fffc20 0 SECTION LOCAL DEFAULT 4
5: 00fffc30 0 SECTION LOCAL DEFAULT 5
6: 00000000 0 FILE LOCAL DEFAULT ABS vector.c
7: 0000010a 0 NOTYPE LOCAL DEFAULT 2 .L11
8: 00000000 0 FILE LOCAL DEFAULT ABS main.c
9: 00fffc22 2 OBJECT LOCAL DEFAULT 4 _static_data
10: 0000010c 148 NOTYPE LOCAL DEFAULT 2 _printval
11: 00fffc30 2 OBJECT LOCAL DEFAULT 5 _static_bss
12: 00000220 0 NOTYPE LOCAL DEFAULT 2 .L4
13: 00000000 0 FILE LOCAL DEFAULT ABS lib.c
14: 00000236 0 NOTYPE LOCAL DEFAULT 2 .L7
15: 0000022a 0 NOTYPE LOCAL DEFAULT 2 .L8
16: 00000258 0 NOTYPE LOCAL DEFAULT 2 .L15
    ……………………………………………………
    ……………………………………………………
    ……………………………………………………
42: 00000384 0 NOTYPE LOCAL DEFAULT 2 .L72
43: 000003be 0 NOTYPE LOCAL DEFAULT 2 .L86
44: 000003e2 0 NOTYPE LOCAL DEFAULT 2 .L75
45: 00000000 0 FILE LOCAL DEFAULT ABS serial.c
46: 00fffc24 12 OBJECT LOCAL DEFAULT 4 _regs
47: 00000482 0 NOTYPE LOCAL DEFAULT 2 .L4
48: 000002d6 50 NOTYPE GLOBAL DEFAULT 2 _strcmp
49: 00fffc32 2 OBJECT GLOBAL DEFAULT 5 _global_bss
50: 00000000 256 OBJECT GLOBAL DEFAULT 1 _vectors
51: 0000034a 46 NOTYPE GLOBAL DEFAULT 2 _putc
52: 000004b0 0 NOTYPE GLOBAL DEFAULT 2 _etext
53: 00000378 36 NOTYPE GLOBAL DEFAULT 2 _puts
54: 00fffc30 0 NOTYPE GLOBAL DEFAULT 5 _bss_start
55: 00000100 0 NOTYPE GLOBAL DEFAULT 2 _text_start
56: 00000436 36 NOTYPE GLOBAL DEFAULT 2 _serial_is_send_enable
57: 00fffc34 0 NOTYPE GLOBAL DEFAULT 5 _ebss
58: 0000023c 40 NOTYPE GLOBAL DEFAULT 2 _memcpy
59: 00000222 26 NOTYPE GLOBAL DEFAULT 2 _memset
60: 00000100 0 NOTYPE GLOBAL DEFAULT 2 _start
61: 00fffc20 0 NOTYPE GLOBAL DEFAULT 4 _data_start
62: 00000400 54 NOTYPE GLOBAL DEFAULT 2 _serial_init
63: 0000039c 100 NOTYPE GLOBAL DEFAULT 2 _putxval
64: 000002b8 30 NOTYPE GLOBAL DEFAULT 2 _strcpy
65: 00fffc20 2 OBJECT GLOBAL DEFAULT 4 _global_data
66: 00000264 58 NOTYPE GLOBAL DEFAULT 2 _memcmp
67: 00000308 66 NOTYPE GLOBAL DEFAULT 2 _strncmp
68: 000004b0 0 NOTYPE GLOBAL DEFAULT 3 _rodata_start
69: 00fffc30 0 NOTYPE GLOBAL DEFAULT 4 _edata
70: 00fffc34 0 NOTYPE GLOBAL DEFAULT ABS _end
71: 0000029e 26 NOTYPE GLOBAL DEFAULT 2 _strlen
72: 0000045a 86 NOTYPE GLOBAL DEFAULT 2 _serial_send_byte
73: 00ffff00 0 NOTYPE GLOBAL DEFAULT 5 _stack
74: 000001a0 130 NOTYPE GLOBAL DEFAULT 2 _main
75: 00000521 0 NOTYPE GLOBAL DEFAULT 3 _erodata


ここでは、関数や変数の配置情報が含まれているようです。

変数ではここの行に注目。
46: 00fffc24 12 OBJECT LOCAL DEFAULT 4 _regs
serial.c中に書かれたregs配列変数は0x00fffc24に割り当てられることを意味しているようです。
そこは、.dataセクションに属しているのでデータ領域、ということはRAMに置かれるようです。

関数ではここの行に注目。
74: 000001a0 130 NOTYPE GLOBAL DEFAULT 2 _main
main.c中に書かれたmainは0x000001a0に割り当てられ、.textセクションに属しているのでテキスト領域、ということはROMに置かれるようです。

※ちなみに、regsの前に_がついていますが、次の説明が書いていありました。
リンカは関数名や変数名をシンボルとして扱います。関数や変数の実体はメモリ上にあるので、シンボルはそれらが存在している特定のアドレスに、便宜上名前をつけたものだそうです。


複数のファイルに定義した関数や変数はここで一括して管理されアドレスが振られています。
リンクを実施してELF形式の実行形式ファイルを作成するなかで複数のソースファイルに記述された内容が集められアドレスの配置まで決まっているようです。