OSDN Git Service

(split) Convert release and draft pages to UTF-8.
[linuxjm/LDP_man-pages.git] / release / man5 / elf.5
1 .\"     $OpenBSD: elf.5,v 1.12 2003/10/27 20:23:58 jmc Exp $
2 .\"Copyright (c) 1999 Jeroen Ruigrok van der Werven
3 .\"All rights reserved.
4 .\"
5 .\"Redistribution and use in source and binary forms, with or without
6 .\"modification, are permitted provided that the following conditions
7 .\"are met:
8 .\"1. Redistributions of source code must retain the above copyright
9 .\"   notice, this list of conditions and the following disclaimer.
10 .\"2. Redistributions in binary form must reproduce the above copyright
11 .\"   notice, this list of conditions and the following disclaimer in the
12 .\"   documentation and/or other materials provided with the distribution.
13 .\"
14 .\"THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 .\"ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 .\"IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 .\"ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 .\"FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 .\"DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 .\"HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 .\"LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 .\"SUCH DAMAGE.
23 .\"
24 .\"     $FreeBSD: src/share/man/man5/elf.5,v 1.21 2001/10/01 16:09:23 ru Exp $
25 .\"
26 .\" Slightly adapted - aeb, 2004-01-01
27 .\" 2005-07-15, Mike Frysinger <vapier@gentoo.org>, various fixes
28 .\" 2007-10-11, Mike Frysinger <vapier@gentoo.org>, various fixes
29 .\" 2007-12-08, mtk, Converted from mdoc to man macros
30 .\"
31 .\" Japanese Version Copyright (c) 2004-2005 Yuichi SATO
32 .\"         all rights reserved.
33 .\" Translated Thu Dec 16 02:17:58 JST 2004
34 .\"         by Yuichi SATO <ysato444@yahoo.co.jp>
35 .\" Updated & Modified Sat Sep 10 02:29:40 JST 2005 by Yuichi SATO
36 .\" Updated 2008-02-12, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>, LDP v2.77
37 .\"
38 .TH ELF 5 2007-12-28 "Linux" "Linux Programmer's Manual"
39 .SH 名前
40 elf \- 実行可能リンクフォーマット (ELF) ファイルのフォーマット
41 .SH 書式
42 .nf
43 .\" .B #include <elf_abi.h>
44 .B #include <elf.h>
45 .fi
46 .SH 説明
47 ヘッダファイル
48 .I <elf.h>
49 は ELF 実行可能バイナリファイルのフォーマットを定義する。
50 これらのファイルとしては、通常の実行可能ファイル・
51 再配置可能オブジェクトファイル・コアファイル・共有ライブラリがある。
52 .PP
53 ELF ファイルフォーマットを使う実行可能ファイルは、
54 ELF ヘッダの後にプログラムヘッダテーブルまたは
55 セクションヘッダテーブル (またはその両方) が続く構成である。
56 ELF ヘッダは常にファイルのオフセット 0 にある。
57 プログラムヘッダテーブルとセクションヘッダテーブルの
58 ファイル内でのオフセットは、ELF ヘッダに定義されている。
59 この 2 つのテーブルはファイルの残りの部分の詳細を記述する。
60 .PP
61 .\" ネイティブなアーキテクチャの ELF バイナリファイルを処理したい
62 .\" アプリケーションは、ソースコードに
63 .\" .I <elf_abi.h>
64 .\" を含めるだけでよい。
65 .\" これらのアプリケーションは、ジェネリック名
66 .\" all the types and structures by their generic names
67 .\" "Elf_xxx"
68 .\" によって全ての型と構造体を参照したり、
69 .\" "ELF_xxx"
70 .\" によってマクロを参照したりするすべきである。
71 .\" このようにして書かれたアプリケーションは、
72 .\" ホストが 32 ビットか 64 ビットかに関わらず、
73 .\" どのアーキテクチャ上でもコンパイルできる。
74 .\" .PP
75 .\" アプリケーションが未知のアーキテクチャの ELF ファイルを
76 .\" 処理する必要がある場合、そのアプリケーションは明示的に
77 .\" "Elf32_xxx"
78 .\" または
79 .\" "Elf64_xxx"
80 .\" という型名と構造体名を使う必要がある。
81 .\" 同様に、マクロは
82 .\" "ELF32_xxx"
83 .\" または
84 .\" "ELF64_xxx"
85 .\" で識別される必要がある。
86 .\" .PP
87 このヘッダファイルは上記のヘッダを C 言語の構造体で記述し、
88 また動的セクション・再配置可能セクション・シンボルテーブルの構造体も
89 含んでいる。
90 .PP
91 以下の型は N ビットアーキテクチャで使われる (N=32,64 であり
92 .I ElfN
93
94 .I Elf32
95 または
96 .I Elf64
97 を表し、
98 .I uintN_t
99
100 .I uint32_t
101 または
102 .I uint64_t
103 を表す):
104 .in +4n
105 .nf
106
107 ElfN_Addr       符号なしのプログラムアドレス, uintN_t
108 ElfN_Off        符号なしのファイルオフセット, uintN_t
109 ElfN_Section    符号なしのセクションインデックス, uint16_t
110 ElfN_Versym     符号なしのバージョンシンボル情報, uint16_t
111 Elf_Byte        unsigned char
112 ElfN_Half       uint16_t
113 ElfN_Sword      int32_t
114 ElfN_Word       uint32_t
115 ElfN_Sxword     int64_t
116 ElfN_Xword      uint64_t
117 .\" Elf32_Size  符号なしのオブジェクトサイズ
118 .fi
119 .in
120 .PP
121 (注意: *BSD での用語は少し異なる。
122 .I Elf64_Half
123
124 .I Elf32_Half
125 の 2 倍であり、
126 .I Elf64Quarter
127
128 .I uint16_t
129 に用いられる。
130 混乱を避けるため、以下では、これらの型はサイズが自明な型に置き換えてある。)
131 .PP
132 このファイルフォーマットが定義する全てのデータ構造体は、
133 関連するクラスの
134 "自然な"
135 サイズと配置の指針に従う。
136 必要な場合、データ構造体では明示的なパディング (padding, 詰め込み)
137 が行なわれる。これは 4 バイトオブジェクトに対する
138 4 バイト配置を保証するためや、
139 構造体のサイズを 4 の倍数にするためなどである。
140 .PP
141 ELF ヘッダは型
142 .I Elf32_Ehdr
143 または
144 .I Elf64_Ehdr
145 で記述される:
146 .in +4n
147 .nf
148
149 #define EI_NIDENT 16
150
151 typedef struct {
152     unsigned char e_ident[EI_NIDENT];
153     uint16_t      e_type;
154     uint16_t      e_machine;
155     uint32_t      e_version;
156     ElfN_Addr     e_entry;
157     ElfN_Off      e_phoff;
158     ElfN_Off      e_shoff;
159     uint32_t      e_flags;
160     uint16_t      e_ehsize;
161     uint16_t      e_phentsize;
162     uint16_t      e_phnum;
163     uint16_t      e_shentsize;
164     uint16_t      e_shnum;
165     uint16_t      e_shstrndx;
166 } ElfN_Ehdr;
167 .fi
168 .in
169 .PP
170 フィールドは以下の意味を持つ:
171 .\" .Bl -tag -width "e_phentsize"
172 .TP 12
173 .IR e_ident
174 このバイト配列は、プロセッサやファイルの他の部分には依存せずに、
175 ファイルを解釈 (interpret) するために指定される。
176 この配列内のすべてのものは、接頭辞
177 .BR EI_
178 で始まるマクロの名前が付き、接頭辞
179 .BR ELF
180 で始まる値を持つ。
181 以下のマクロが定義されている:
182 .RS 12
183 .\" .Bl -tag -width "EI_VERSION" \" EI_ABIVERSION
184 .TP 12
185 .BR EI_MAG0
186 マジックナンバーの第 1 バイト。
187 .BR ELFMAG0
188 で埋めなければならない。
189 (0: 0x7f)
190 .TP
191 .BR EI_MAG1
192 マジックナンバーの第 2 バイト。
193 .BR ELFMAG1
194 で埋めなければならない。
195 (1: \(aqE\(aq)
196 .TP
197 .BR EI_MAG2
198 マジックナンバーの第 3 バイト。
199 .BR ELFMAG2
200 で埋めなければならない。
201 (2: \(aqL\(aq)
202 .TP
203 .BR EI_MAG3
204 マジックナンバーの第 4 バイト。
205 .BR ELFMAG3
206 で埋めなければならない。
207 (3: \(aqF\(aq)
208 .TP
209 .BR EI_CLASS
210 第 5 バイトは、このバイナリのアーキテクチャを示す:
211 .RS 12
212 .\" .Bl -tag -width "ELFCLASSNONE" -compact
213 .TP 14
214 .PD 0
215 .BR ELFCLASSNONE
216 このクラスは不正である。
217 .TP
218 .BR ELFCLASS32
219 32 ビットアーキテクチャを定義する。
220 ファイルと仮想アドレス空間が 4 ギガバイトまでのマシンをサポートする。
221 .TP
222 .BR ELFCLASS64
223 64 ビットアーキテクチャを定義する。
224 .PD
225 .RE
226 .\" .El
227 .TP
228 .BR EI_DATA
229 第 6 バイトはファイル内のプロセッサ固有データの
230 データエンコーディングを指定する。
231 現在のところ以下のエンコーディングがサポートされている:
232 .\" .Bl -tag -width "ELFDATA2LSB" -compact
233 .RS 12
234 .TP 14
235 .PD 0
236 .BR ELFDATANONE
237 不明なデータフォーマット。
238 .TP
239 .BR ELFDATA2LSB
240 2 の補数、リトルエンディアン。
241 .TP
242 .BR ELFDATA2MSB
243 2 の補数、ビッグエンディアン。
244 .PD
245 .RE
246 .\" .El
247 .TP
248 .PD 0
249 .BR EI_VERSION
250 ELF 仕様のバージョン番号:
251 .\" .Bl -tag -width "EV_CURRENT" -compact
252 .RS 12
253 .TP 14
254 .BR EV_NONE
255 不正なバージョン。
256 .TP
257 .BR EV_CURRENT
258 現在のバージョン。
259 .PD
260 .RE
261 .\".El
262 .TP
263 .BR EI_OSABI
264 このバイトはオブジェクトのターゲットとなる
265 オペレーティングシステムと ABI を示す。
266 他の ELF 構造体のフィールドには、
267 プラットフォーム固有の意味を持つフラグや値を持つものもある;
268 これらのフィールドの解釈は、このバイトの値によって決定される。
269 例えば:
270 .\" .Bl -tag -width "ELFOSABI_STANDALONE" -compact
271 .RS 12
272 .TP 20
273 .PD 0
274 .BR ELFOSABI_NONE
275 ELFOSABI_SYSV と同じ。
276 .\" 0
277 .TP
278 .BR ELFOSABI_SYSV
279 UNIX System V ABI.
280 .\" 0
281 .\" synonym: ELFOSABI_NONE
282 .TP
283 .BR ELFOSABI_HPUX
284 HP-UX ABI.
285 .\" 1
286 .TP
287 .BR ELFOSABI_NETBSD
288 NetBSD ABI.
289 .\" 2
290 .TP
291 .BR ELFOSABI_LINUX
292 Linux ABI.
293 .\" 3
294 .\" .TP
295 .\" .BR ELFOSABI_HURD
296 .\" Hurd ABI.
297 .\" 4
298 .\" .TP
299 .\" .BR ELFOSABI_86OPEN
300 .\" 86Open Common IA32 ABI.
301 .\" 5
302 .TP
303 .BR ELFOSABI_SOLARIS
304 Solaris ABI.
305 .\" 6
306 .\" .It Dv ELFOSABI_MONTEREY
307 .\" Monterey project ABI.
308 .\" ELFOSABI_AIX
309 .\" 7
310 .TP
311 .BR ELFOSABI_IRIX
312 IRIX ABI.
313 .\" 8
314 .TP
315 .BR ELFOSABI_FREEBSD
316 FreeBSD ABI.
317 .\" 9
318 .TP
319 .BR ELFOSABI_TRU64
320 TRU64 UNIX ABI.
321 .\" 10
322 .\" ELFOSABI_MODESTO
323 .\" 11
324 .\" ELFOSABI_OPENBSD
325 .\" 12
326 .TP
327 .BR ELFOSABI_ARM
328 ARM アーキテクチャ ABI.
329 .\" 97
330 .TP
331 .BR ELFOSABI_STANDALONE
332 スタンドアロン (組み込み) ABI.
333 .\" 255
334 .\" .El
335 .PD
336 .RE
337 .TP
338 .BR EI_ABIVERSION
339 このバイトはオブジェクトがターゲットとしている ABI のバージョンを示す。
340 このフィールドは互換性のない ABI のバージョンを区別するために使われる。
341 このバージョン番号の解釈は、
342 .B EI_OSABI
343 フィールドで識別される ABI に依存する。
344 この仕様に準拠するアプリケーションは、値 0 を使う。
345 .TP
346 .BR EI_PAD
347 パディングの開始。
348 これらのバイトは予約されており、0 に設定されている。
349 これらを読み込むプログラムは、これらのバイトを無視すべきである。
350 現在使われていないバイトに意味が与えられる場合、
351 .B EI_PAD
352 の値は将来変更されるかもしれない。
353 .TP
354 .BR EI_BRAND
355 アーキテクチャ ID の開始。
356 .TP
357 .BR EI_NIDENT
358 .I e_ident
359 配列のサイズ。
360 .\" .El
361 .RE
362 .TP
363 .IR e_type
364 この構造体のメンバはオブジェクトファイルタイプを示す:
365 .RS 12
366 .\" .Bl -tag -width "ET_NONE" -compact
367 .TP 12
368 .PD 0
369 .BR ET_NONE
370 不明なタイプ。
371 .TP
372 .BR ET_REL
373 再配置可能ファイル。
374 .TP
375 .BR ET_EXEC
376 実行可能ファイル。
377 .TP
378 .BR ET_DYN
379 共有オブジェクト。
380 .TP
381 .BR ET_CORE
382 コアファイル。
383 .PD
384 .RE
385 .\" .El
386 .TP
387 .IR e_machine
388 このメンバは個々のファイルに必要とされるアーキテクチャを指定する。
389 例:
390 .RS 12
391 .\" .Bl -tag -width "EM_MIPS_RS4_BE" -compact
392 .TP 12
393 .PD 0
394 .BR EM_NONE
395 不明なマシン。
396 .\" 0
397 .TP
398 .BR EM_M32
399 AT&T WE 32100.
400 .\" 1
401 .TP
402 .BR EM_SPARC
403 Sun Microsystems SPARC.
404 .\" 2
405 .TP
406 .BR EM_386
407 Intel 80386.
408 .\" 3
409 .TP
410 .BR EM_68K
411 Motorola 68000.
412 .\" 4
413 .TP
414 .BR EM_88K
415 Motorola 88000.
416 .\" 5
417 .\" .It Dv EM_486
418 .\" Intel 80486.
419 .\" 6
420 .TP
421 .BR EM_860
422 Intel 80860.
423 .\" 7
424 .TP
425 .BR EM_MIPS
426 MIPS RS3000 (ビッグエンディアンのみ)。
427 .\" 8
428 .\" EM_S370
429 .\" 9
430 .\" .It Dv EM_MIPS_RS4_BE
431 .\" MIPS RS4000 (ビッグエンディアンのみ)。非推奨。
432 .\" 10
433 .\" EM_MIPS_RS3_LE (MIPS R3000 リトルエンディアン)。
434 .\" 10
435 .TP
436 .BR EM_PARISC
437 HP/PA.
438 .\" 15
439 .TP
440 .BR EM_SPARC32PLUS
441 拡張命令セット付き SPARC。
442 .\" 18
443 .TP
444 .BR EM_PPC
445 PowerPC.
446 .\" 20
447 .TP
448 .BR EM_PPC64
449 PowerPC 64-bit.
450 .\" 21
451 .TP
452 .BR EM_S390
453 IBM S/390
454 .\" 22
455 .TP
456 .BR EM_ARM
457 Advanced RISC Machines
458 .\" 40
459 .TP
460 .BR EM_SH
461 Renesas SuperH
462 .\" 42
463 .TP
464 .BR EM_SPARCV9
465 SPARC v9 64-bit.
466 .\" 43
467 .TP
468 .BR EM_IA_64
469 Intel Itanium
470 .\" 50
471 .TP
472 .BR EM_X86_64
473 AMD x86-64
474 .\" 62
475 .TP
476 .BR EM_VAX
477 DEC Vax.
478 .\" 75
479 .\" EM_CRIS
480 .\" 76
481 .\" .It Dv EM_ALPHA
482 .\" Compaq [DEC] Alpha.
483 .\" .It Dv EM_ALPHA_EXP
484 .\" 拡張命令セット付き Compaq [DEC] Alpha。
485 .PD
486 .RE
487 .\" .El
488 .TP
489 .IR e_version
490 このメンバはファイルバージョンを示す:
491 .\" .Bl -tag -width "EV_CURRENT" -compact
492 .RS 12
493 .TP 12
494 .PD 0
495 .BR EV_NONE
496 不正なバージョン。
497 .TP
498 .BR EV_CURRENT
499 現在のバージョン。
500 .\" .El
501 .PD
502 .RE
503 .TP
504 .IR e_entry
505 このメンバは、システムが最初に制御を渡す、
506 つまりプロセスを開始する仮想アドレスを指定する。
507 ファイルにエントリポイントが関連付けられていない場合、
508 このメンバには 0 が入る。
509 .TP
510 .IR e_phoff
511 このメンバはプログラムヘッダテーブルの
512 ファイルオフセット (バイト単位) を保持する。
513 ファイルにプログラムヘッダテーブルがない場合、
514 このメンバには 0 が入る。
515 .TP
516 .IR e_shoff
517 このメンバはセクションヘッダテーブルの
518 ファイルオフセット (バイト単位) を保持する。
519 ファイルにセクションヘッダテーブルがない場合、
520 このメンバには 0 が入る。
521 .TP
522 .IR e_flags
523 このメンバはファイルに関連付けられたプロセッサ固有のフラグを保持する。
524 フラグの名前は EF_`machine_flag' という形式である。
525 現在のところフラグは定義されていない。
526 .TP
527 .IR e_ehsize
528 このメンバは ELF ヘッダサイズ (バイト単位) を保持する。
529 .TP
530 .IR e_phentsize
531 このメンバはこのファイルのプログラムヘッダテーブルの
532 1 エントリあたりのサイズ (バイト単位) を保持する;
533 全てのエントリは同じサイズである。
534 .TP
535 .IR e_phnum
536 このメンバはプログラムヘッダテーブルにあるエントリの数を保持する。
537 よって
538 .IR e_phentsize
539
540 .IR e_phnum
541 の積がテーブルサイズ (バイト単位) になる。
542 ファイルにプログラムヘッダがない場合、
543 .IR e_phnum
544 は値 0 を保持する。
545 .TP
546 .IR e_shentsize
547 このメンバはセクションヘッダのサイズ (バイト単位) を保持する。
548 セクションヘッダはセクションヘッダテーブルの 1 つのエントリである;
549 全てのエントリは同じサイズである。
550 .TP
551 .IR e_shnum
552 このメンバはセクションヘッダテーブルにあるエントリの数を保持する。
553 よって
554 .IR e_shentsize
555
556 .IR e_shnum
557 の積はセクションヘッダテーブルのサイズ (バイト単位) になる。
558 ファイルにセクションヘッダテーブルがない場合、
559 .IR e_shnum
560 は値 0 を保持する。
561 .TP
562 .IR e_shstrndx
563 このメンバはセクション名文字列テーブルに関連付けられたエントリの
564 セクションヘッダテーブルインデックスを保持する。
565 ファイルにセクション名文字列テーブルがない場合、
566 このメンバは値
567 .BR SHN_UNDEF
568 を保持する。
569 .BR SHN_UNDEF .
570 .RS 12
571 .\" .Bl -tag -width "SHN_LORESERVE"
572 .TP 14
573 .BR SHN_UNDEF
574 この値は未定義・存在しない・無関係その他、
575 意味のないセクションの参照であることを表す。
576 例えば、セクション番号
577 .BR SHN_UNDEF
578 に関連づけて「定義」されたシンボルは、「未定義」なシンボルである。
579 .\"nakano ここの "defined" は通常の文の一部では?
580 .TP
581 .BR SHN_LORESERVE
582 この値は予約済みのインデックス範囲の下限を指定する。
583 .TP
584 .BR SHN_LOPROC
585 この値以上で
586 .BR SHN_HIPROC
587 以下の値は、プロセッサ固有の意味に予約されている。
588 .TP
589 .BR SHN_HIPROC
590 この値以下で
591 .BR SHN_LOPROC
592 以上の値は、プロセッサ固有の意味に予約されている。
593 .\"sato: SHN_{HI,LO}PROC の説明は、原文の間違いらしい。
594 .TP
595 .BR SHN_ABS
596 この値は対応する参照の絶対値を指定する。
597 例えば、セクション番号
598 .BR SHN_ABS
599 に関連づけられたシンボルは絶対値を保持し、再配置に影響されない。
600 .TP
601 .BR SHN_COMMON
602 このセクションに関連して定義されたシンボルは、
603 Fortran の COMMON や C の未割り当て external 変数のような、
604 共通シンボルである。
605 .TP
606 .BR SHN_HIRESERVE
607 この値は予約されたインデックスの範囲の上限を指定する。
608 .BR SHN_LORESERVE
609
610 .BR SHN_HIRESERVE
611 は含まれる。
612 この値はセクションヘッダテーブルを参照しない。
613 つまり、セクションヘッダテーブルは
614 予約されたインデックスのエントリを
615 .I 含まない 。
616 .RE
617 .\" .El
618 .\" .El
619 .PP
620 実行可能ファイルまたは共有オブジェクトファイルのプログラムヘッダテーブルは、
621 システムによるプログラム実行準備に必要な、
622 セグメント等の情報を記述する構造体の配列である。
623 オブジェクトファイルの
624 .IR セグメント
625 には 1 つ以上の
626 .IR セクション
627 が含まれる。
628 プログラムヘッダは実行可能ファイルと共有オブジェクトファイルでのみ意味を持つ。
629 ファイルは自身のプログラムヘッダサイズを ELF ヘッダの
630 .IR e_phentsize
631 メンバと
632 .IR e_phnum
633 メンバで指定する。
634 ELF プログラムヘッダは
635 .I Elf32_Phdr
636 型または
637 .I Elf64_Phdr
638 型で記述される
639 (どちらになるかはアーキテクチャ依存):
640 .in +4n
641 .nf
642
643 typedef struct {
644     uint32_t   p_type;
645     Elf32_Off  p_offset;
646     Elf32_Addr p_vaddr;
647     Elf32_Addr p_paddr;
648     uint32_t   p_filesz;
649     uint32_t   p_memsz;
650     uint32_t   p_flags;
651     uint32_t   p_align;
652 } Elf32_Phdr;
653 .fi
654 .in
655 .in +4n
656 .nf
657
658 typedef struct {
659     uint32_t   p_type;
660     uint32_t   p_flags;
661     Elf64_Off  p_offset;
662     Elf64_Addr p_vaddr;
663     Elf64_Addr p_paddr;
664     uint64_t   p_filesz;
665     uint64_t   p_memsz;
666     uint64_t   p_align;
667 } Elf64_Phdr;
668 .fi
669 .in
670 .PP
671 32 ビットと 64 ビットのプログラムヘッダの主な違いは、構造体における
672 .IR p_flags
673 メンバの位置にある。
674 .\" .Bl -tag -width "p_offset"
675 .TP 12
676 .IR p_type
677 Phdr 構造体のこのメンバは、
678 この配列要素がどのような種類のセグメントを記述しているか、
679 またはこの配列要素の情報をどのように解釈するか、を表す。
680 .\" .Bl -tag -width "PT_DYNAMIC"
681 .RS 12
682 .TP 12
683 .BR PT_NULL
684 この配列要素は使用されておらず、その他のメンバの値は未定義である。
685 これにより、このプログラムヘッダのエントリは無視される。
686 .TP
687 .BR PT_LOAD
688 この配列要素は
689 .IR p_filesz
690
691 .IR p_memsz
692 で記述されるロード可能セグメントを指定する。
693 このファイルからのバイトデータが、このメモリセグメントの先頭からマップされる。
694 セグメントのメモリサイズ
695 .IR Sy p_memsz
696 がファイルサイズ
697 .IR Sy p_filesz
698 より大きい場合、
699 「余った」バイトは値 0 となり、
700 そのセグメント初期化データの後ろに置かれると定められている。
701 ファイルサイズはメモリサイズより大きくてはいけない。
702 プログラムヘッダテーブルのロード可能セグメントエントリは、
703 .IR p_vaddr
704 メンバの昇順にソートされて出現する。
705 .TP
706 .BR PT_DYNAMIC
707 この配列要素は動的リンク情報を指定する。
708 .TP
709 .BR PT_INTERP
710 この配列要素は、インタプリタとして起動されるパス名 (NULL 文字終端)
711 の位置とサイズを指定する。
712 このセグメント型は (共有オブジェクトにもあるかも知れないが)
713 実行可能ファイルでのみ意味を持つ。
714 ただし、このセグメント型は 1 つのファイルに 2 回以上出現してはならない。
715 もし存在する場合、このセグメント型は
716 全てのロード可能セグメントエントリより前になければならない。
717 .TP
718 .BR PT_NOTE
719 この配列要素は補足情報 (auxiliary information) の位置とサイズを指定する。
720 .TP
721 .BR PT_SHLIB
722 このセグメント型は予約されているが、意味は指定されていない。
723 この型の配列要素を保持するプログラムは ABI に準拠しない。
724 .TP
725 .BR PT_PHDR
726 この配列要素は、もし存在しているならば、
727 ファイルおよびプログラムのメモリイメージ双方における
728 プログラムヘッダテーブル自身の位置とサイズを指定する。
729 このセグメント型は 1 つのファイルに 2 回以上出現してはならない。
730 さらに、このセグメント型が存在してもよいのは、プログラムヘッダテーブルが
731 プログラムのメモリイメージの一部である場合のみである。
732 もし存在する場合、これは全てのロード可能セグメントエントリより
733 前になければならない。
734 .TP
735 .BR PT_LOPROC
736 この値以上で
737 .BR PT_HIPROC
738 以下の値はプロセッサ固有の意味に予約されている。
739 .TP
740 .BR PT_HIPROC
741 この値以下で
742 .BR PT_LOPROC
743 以上の値はプロセッサ固有の意味に予約されている。
744 .\"sato: PT_{HI,LO}PROC の説明は、原文の間違いらしい。
745 .TP
746 .BR PT_GNU_STACK
747 GNU 拡張であり、Linux カーネルが
748 .I p_flags
749 のメンバーにセットされたフラグ経由でスタックの状態を制御するために使用する。
750 .\" .El
751 .RE
752 .TP
753 .IR p_offset
754 このメンバは、セグメントの先頭バイトがある
755 (ファイル先頭からの) オフセットを保持する。
756 .TP
757 .IR p_vaddr
758 このメンバは、セグメントの先頭バイトがある
759 メモリの仮想アドレスを保持する。
760 .TP
761 .IR p_paddr
762 物理アドレスが意味をもつシステムでは、
763 このメンバはセグメントの物理アドレスとして予約されている。
764 BSD ではこのメンバは使用されない。0 でなければならない。
765 .TP
766 .IR p_filesz
767 このメンバはセグメントのファイルイメージのバイト数を保持する。
768 これは 0 でもよい。
769 .TP
770 .IR p_memsz
771 このメンバはセグメントのメモリイメージのバイト数を保持する。
772 これは 0 でもよい。
773 .TP
774 .IR p_flags
775 このメンバはセグメントに関連するフラグのビットマップを保持する:
776 .\" .Bl -tag -width "PF_X" -compact
777 .RS 12
778 .TP
779 .PD 0
780 .BR PF_X
781 実行可能セグメント。
782 .TP
783 .BR PF_W
784 書き込み可能セグメント.
785 .TP
786 .BR PF_R
787 読み込み可能セグメント。
788 .PD
789 .RE
790 .\" .El
791 .IP
792 テキストセグメントは一般にフラグ
793 .BR PF_X
794
795 .BR PF_R
796 を持つ。
797 データセグメントは一般に
798 .BR PF_X ,
799 .BR PF_W ,
800 .BR PF_R
801 を持つ。
802 .TP
803 .IR p_align
804 このメンバは、セグメントがメモリおよびファイルにおいて配置 (align)
805 される値を保持する。
806 .\"nakano align の定訳はありましたっけ?
807 ロード可能プロセスセグメントは、ページサイズを法として
808 .IR p_vaddr
809
810 .IR p_offset
811 と合同でなければならない
812 (訳注:「p_vaddr mod ページサイズ = p_offset mod ページサイズ」
813 でなければならない)。。
814 .\"nakano こういう場合は普通 congruent "with" だけど…
815 0 と 1 という値は配置が必要ないことを意味する。
816 それ以外の場合、
817 .IR p_align
818 は正で 2 の整数乗でなければならず、
819 .IR p_vaddr
820
821 .IR p_align
822 を法として
823 .IR p_offset
824 と合同でなければならない
825 (訳注:「p_vaddr mod p_align = p_offset mod p_align」でなければならない)。
826 .\" .El
827 .PP
828 ファイルのセクションヘッダテーブルには、
829 全てのファイルセクションの場所が記述されている。
830 セクションヘッダテーブルは
831 .I Elf32_Shdr
832 構造体または
833 .I Elf64_Shdr
834 構造体の配列である。
835 ELF ヘッダの
836 .IR e_shoff
837 メンバはファイルの先頭から
838 セクションヘッダテーブルへのバイトオフセットである。
839 .IR e_shnum
840 はセクションヘッダテーブルに含まれるエントリの数を保持する。
841 .IR e_shentsize
842 は各エントリのサイズ (バイト単位) を保持する。
843 .PP
844 セクションヘッダテーブルインデックスは、この配列の要素を指定する。
845 いくつかのセクションヘッダテーブルインデックスは予約されている。
846 オブジェクトファイルは、これらの特別なインデックスに対応する
847 セクションを持たない:
848 .\" .Bl -tag -width "SHN_LORESERVE"
849 .TP 14
850 .BR SHN_UNDEF
851 この値は未定義・不明・無関係・無意味なセクション参照の印となる。
852 .TP
853 .BR SHN_LORESERVE
854 この値は予約済みのインデックス領域の下限を指定する。
855 .TP
856 .BR SHN_LOPROC
857 この値以上で
858 .BR SHN_HIPROC
859 以下の値はプロセッサ固有の意味に予約されている。
860 .TP
861 .BR SHN_HIPROC
862 この値以下で
863 .BR SHN_HIPROC
864 以上の値はプロセッサ固有の意味に予約されている。
865 .\"sato: SHN_{HI,LO}PROC の説明は、原文の間違いらしい。
866 .TP
867 .BR SHN_ABS
868 この値は対応する参照の絶対値を指定する。
869 例えば、セクション番号
870 .BR SHN_ABS
871 に関連して定義されているシンボルは、
872 絶対値を保持しているので、再配置に影響されない。
873 .\"nakano "relative to" がちょっと訳しにくい。
874 .\"nakano 要するに SHN_ABS のセクションには絶対値が store される、
875 .\"nakano 後述の SHN_COMMON には global 変数が store される、
876 .\"nakano ということなのでしょうが。
877 .TP
878 .BR SHN_COMMON
879 このセクションに関連して定義されているシンボルは、
880 FORTRAN の COMMON や C の未割り当て外部変数のような共通シンボルである。
881 .TP
882 .BR SHN_HIRESERVE
883 この値は予約済みのインデックス領域の上限を指定する。
884 システムは
885 .BR SHN_LORESERVE
886
887 .BR SHN_HIRESERVE
888 を含む範囲を予約する。
889 セクションヘッダテーブルは予約されたインデックスに対応するエントリを持たない。
890 .\" .El
891 .PP
892 セクションヘッダは以下の構造体を持つ:
893 .in +4n
894 .nf
895
896 typedef struct {
897     uint32_t   sh_name;
898     uint32_t   sh_type;
899     uint32_t   sh_flags;
900     Elf32_Addr sh_addr;
901     Elf32_Off  sh_offset;
902     uint32_t   sh_size;
903     uint32_t   sh_link;
904     uint32_t   sh_info;
905     uint32_t   sh_addralign;
906     uint32_t   sh_entsize;
907 } Elf32_Shdr;
908 .fi
909 .in
910 .in +4n
911 .nf
912
913 typedef struct {
914     uint32_t   sh_name;
915     uint32_t   sh_type;
916     uint64_t   sh_flags;
917     Elf64_Addr sh_addr;
918     Elf64_Off  sh_offset;
919     uint64_t   sh_size;
920     uint32_t   sh_link;
921     uint32_t   sh_info;
922     uint64_t   sh_addralign;
923     uint64_t   sh_entsize;
924 } Elf64_Shdr;
925 .fi
926 .in
927 .PP
928 32 ビットと 64 ビットのセクションヘッダには実際の違いはない。
929 .\" .Bl -tag -width "sh_addralign"
930 .TP 10
931 .IR sh_name
932 このメンバはセクション名を定める。
933 この値はセクションヘッダ文字列テーブルセクションのインデックスであり、
934 NULL 文字で終端された文字列の場所を示す。
935 .TP
936 .IR sh_type
937 このメンバはセクションの内容と意味が含まれるカテゴリを示す。
938 .\" .Bl -tag -width "SHT_PROGBITS"
939 .RS 10
940 .TP 15
941 .BR SHT_NULL
942 この値はセクションヘッダが不活性であることを示す。
943 これは関連するセクションを持たない。
944 このセクションヘッダの他のメンバは、未定義の値を持つ。
945 .TP
946 .BR SHT_PROGBITS
947 このセクションはプログラムにより定義される情報を保持する。
948 この情報の形式と意味は、ひとえにプログラムによって決定される。
949 .TP
950 .BR SHT_SYMTAB
951 このセクションはシンボルテーブルを保持する。
952 一般には
953 .BR SHT_SYMTAB
954 はリンク編集のためのシンボルを提供するが、
955 動的リンクにも使われる。
956 完全なシンボルテーブルとして、動的リンクには不要な
957 多くのシンボルを保持できる。
958 オブジェクトファイルも
959 .BR SHT_DYNSYM
960 セクションを持つことができる。
961 .TP
962 .BR SHT_STRTAB
963 このセクションは文字列テーブルを保持する。
964 オブジェクトファイルは複数の文字列テーブルセクションを持つことができる。
965 .TP
966 .BR SHT_RELA
967 このセクションは明示的な加数 (addend) を持つ再配置エントリを保持する。
968 再配置エントリの型は、オブジェクトファイルの 32 ビットクラスでは
969 .IR Elf32_Rela
970 である。
971 オブジェクトファイルは複数の再配置セクションを持つことができる。
972 .TP
973 .BR SHT_HASH
974 このセクションはシンボルハッシュテーブルを保持する。
975 動的リンクされるオブジェクトは、
976 シンボルハッシュテーブルを含んでいなければならない。
977 オブジェクトファイルは 1 つのハッシュテーブルのみを持つことができる。
978 .TP
979 .BR SHT_DYNAMIC
980 このセクションは動的リンクの情報を保持する。
981 オブジェクトファイルは 1 つの動的セクションのみを持つことができる。
982 .TP
983 .BR SHT_NOTE
984 このセクションはファイルに何らかの印を付ける情報を保持する。
985 .TP
986 .BR SHT_NOBITS
987 このタイプのセクションはファイルの領域を使わないという以外は、
988 .BR SHT_PROGBITS
989 と似ている。
990 このセクションは 1 バイトも含まないが、
991 .IR sh_offset
992 メンバは概念的なファイルオフセットを持つ。
993 .TP
994 .BR SHT_REL
995 このセクションは明示的な加数を持たない再配置オフセットを保持する。
996 再配置オフセットの型は、オブジェクトファイルの 32 ビットクラスでは
997 .IR Elf32_Rel
998 である。
999 オブジェクトファイルは複数の再配置セクションを持つことができる。
1000 .TP
1001 .BR SHT_SHLIB
1002 このセクションは予約されているが、意味は指定されていない。
1003 .TP
1004 .BR SHT_DYNSYM
1005 このセクションは動的リンクシンボルの最小セットを保持する。
1006 オブジェクトファイルは
1007 .BR SHT_SYMTAB
1008 セクションも含むことができる。
1009 .TP
1010 .BR SHT_LOPROC
1011 この値以上で
1012 .BR SHT_HIPROC
1013 以下の範囲はプロセッサ固有の意味に予約されている。
1014 .TP
1015 .BR SHT_HIPROC
1016 この値以下で
1017 .BR SHT_LOPROC
1018 以上の範囲はプロセッサ固有の意味に予約されている。
1019 .TP
1020 .BR SHT_LOUSER
1021 この値はアプリケーションプログラムのために予約される
1022 インデックス範囲の下限を指定する。
1023 .TP
1024 .BR SHT_HIUSER
1025 この値はアプリケーションプログラムのために予約される
1026 インデックス範囲の上限を指定する。
1027 .BR SHT_LOUSER
1028 から
1029 .BR SHT_HIUSER
1030 の間のセクションタイプは、
1031 現在または将来のシステム定義セクションタイプと衝突することなく、
1032 アプリケーションで使用することができる。
1033 .\" .El
1034 .RE
1035 .TP
1036 .IR sh_flags
1037 様々な属性を記述するための 1 ビットのフラグをサポートするセクション。
1038 フラグビットが
1039 .IR sh_flags
1040 に設定された場合、そのセクションについての属性は
1041 "オン"
1042 になる。
1043 それ以外の場合、属性が
1044 "オフ"
1045 であるか属性が適用されない。
1046 未定義の属性は 0 に設定される。
1047 .\" .Bl -tag -width "SHF_EXECINSTR" -compact
1048 .RS 10
1049 .TP 15
1050 .BR SHF_WRITE
1051 このセクションはプロセス実行中に書き込み可能なデータを含む。
1052 .TP
1053 .BR SHF_ALLOC
1054 このセクションはプロセス実行中にメモリを使用する。
1055 制御セクションの中には、オブジェクトファイルのメモリイメージには
1056 存在しないものもある。
1057 そうしたセクションの場合、この属性はオフである。
1058 .TP
1059 .BR SHF_EXECINSTR
1060 このセクションは実行可能なマシン命令を含む。
1061 .TP
1062 .BR SHF_MASKPROC
1063 このマスクに含まれる全てのビットはプロセッサ固有の意味に予約されている。
1064 .RE
1065 .\" .El
1066 .TP
1067 .IR sh_addr
1068 このセクションがプロセスのメモリイメージにある場合、
1069 このメンバはセクションの最初のバイトが存在するアドレスを保持する。
1070 それ以外の場合、このメンバは 0 である。
1071 .TP
1072 .IR sh_offset
1073 このメンバの値は、ファイルの先頭からセクションの最初のバイトへの
1074 バイトオフセットを保持する。
1075 セクションタイプ
1076 .BR SHT_NOBITS
1077 はファイルの領域を全く使用せず、このタイプの
1078 .IR sh_offset
1079 メンバはファイルの概念的な位置を示す。
1080 .\"nakano conceptual placement とは?
1081 .TP
1082 .IR sh_size
1083 このメンバはセクションのサイズ (バイト単位) を保持する。
1084 セクションタイプが
1085 .BR SHT_NOBITS
1086 でない限り、そのセクションはファイル中の
1087 .IR sh_size
1088 バイトを使用する。
1089 タイプが
1090 .BR SHT_NOBITS
1091 のセクションはサイズが 0 でないが、ファイルの領域を使用しない。
1092 .TP
1093 .IR sh_link
1094 このメンバは、セクションヘッダテーブルインデックスリンクを保持する。
1095 この解釈はセクションタイプに依存する。
1096 .TP
1097 .IR sh_info
1098 このメンバは追加情報を保持する。
1099 この解釈はセクションタイプに依存する。
1100 .TP
1101 .IR sh_addralign
1102 アドレス配置に制約があるセクションもある。
1103 セクションが倍長語 (doubleword) を保持する場合、
1104 システムは全てのセクションについて倍長語の配置を保証しなければならない。
1105 つまり、
1106 .IR sh_addr
1107 の値は
1108 .IR sh_addralign
1109 の値を法として 0 と合同でなければならない
1110 (訳注:「sh_addr mod sh_addralign = 0 でなければならない)。
1111 2 の 0 乗と正の整数乗のみが許可される。
1112 0 または 1 はセクションの配置に制約がないことを意味する。
1113 .TP
1114 .IR sh_entsize
1115 シンボルテーブルのような固定サイズエントリのテーブルを保持する
1116 セクションもある。
1117 このようなセクションでは、
1118 このメンバは各エントリのサイズ (バイト単位) を表す。
1119 このメンバが 0 の場合、
1120 そのセクションは固定サイズエントリのテーブルを保持しない。
1121 .\" .El
1122 .PP
1123 さまざまなセクションにプログラム情報・制御情報が保持される:
1124 .\" .Bl -tag -width ".shstrtab"
1125 .TP 10
1126 .IR .bss
1127 このセクションはプログラムのメモリイメージに配置される
1128 非初期化データを保持する。
1129 定義上、システムはプログラムの実行開始時に、データを 0 で初期化する。
1130 このセクションのタイプは
1131 .BR SHT_NOBITS
1132 である。
1133 属性タイプは
1134 .BR SHF_ALLOC
1135
1136 .BR SHF_WRITE
1137 である。
1138 .TP
1139 .IR .comment
1140 このセクションはバージョン制御情報を保持する。
1141 このセクションのタイプは
1142 .BR SHT_PROGBITS
1143 である。
1144 属性タイプは使用されない。
1145 .TP
1146 .IR .ctors
1147 このセクションは C++ コンストラクタ関数への初期化されたポインタを保持する。
1148 このセクションのタイプは
1149 .BR SHT_PROGBITS
1150 である。
1151 属性タイプは
1152 .BR SHF_ALLOC
1153
1154 .BR SHF_WRITE
1155 である。
1156 .TP
1157 .IR .data
1158 このセクションはプログラムのメモリイメージに配置される
1159 初期化済みデータを保持する。
1160 このセクションのタイプは
1161 .BR SHT_PROGBITS
1162 である。
1163 属性タイプは
1164 .BR SHF_ALLOC
1165
1166 .BR SHF_WRITE
1167 である。
1168 .TP
1169 .IR .data1
1170 このセクションはプログラムのメモリイメージに配置される
1171 初期化済みデータを保持する。
1172 このセクションのタイプは
1173 .BR SHT_PROGBITS
1174 である。
1175 属性タイプは
1176 .BR SHF_ALLOC
1177
1178 .BR SHF_WRITE
1179 である。
1180 .TP
1181 .IR .debug
1182 このセクションはシンボリックデバッグ用の情報を保持する。
1183 その内容は指定されていない。
1184 このセクションのタイプは
1185 .BR SHT_PROGBITS
1186 である。
1187 属性タイプは使用されない。
1188 .TP
1189 .IR .dtors
1190 このセクションは C++ デストラクタ関数への初期化されたポインタを保持する。
1191 このセクションのタイプは
1192 .BR SHT_PROGBITS
1193 である。
1194 属性タイプは
1195 .BR SHF_ALLOC
1196
1197 .BR SHF_WRITE
1198 である。
1199 .TP
1200 .IR .dynamic
1201 このセクションは動的リンク情報を保持する。
1202 このセクションの属性は
1203 .BR SHF_ALLOC
1204 ビットを含む。
1205 .BR SHF_WRITE
1206 ビットが設定されるか否かはプロセッサによる。
1207 このセクションのタイプは
1208 .BR SHT_DYNAMIC
1209 である。
1210 上記の属性を参照すること。
1211 .TP
1212 .IR .dynstr
1213 このセクションは動的リンクに必要な文字列を保持する。
1214 最も一般的には、この文字列はシンボルテーブルエントリと
1215 関連づけられた名前を表す。
1216 このセクションのタイプは
1217 .BR SHT_STRTAB
1218 である。
1219 使用される属性タイプは
1220 .BR SHF_ALLOC
1221 である。
1222 .TP
1223 .IR .dynsym
1224 このセクションは動的リンクシンボルテーブルを保持する。
1225 このセクションのタイプは
1226 .BR SHT_DYNSYM
1227 である。
1228 使用される属性タイプは
1229 .BR SHF_ALLOC
1230 である。
1231 .TP
1232 .IR .fini
1233 このセクションはプロセス終了コードに置かれる実行可能命令を保持する。
1234 プロセスが正常に終了した場合、システムはこのセクションにある
1235 コードを配置して実行する。
1236 このセクションのタイプは
1237 .BR SHT_PROGBITS
1238 である。
1239 使用される属性タイプは
1240 .BR SHF_ALLOC
1241
1242 .BR SHF_EXECINSTR
1243 である。
1244 .TP
1245 .IR .gnu.version
1246 このセクションはバージョン・シンボル・テーブルを保持する。
1247 その内容は
1248 .I ElfN_Half
1249 要素の配列である。
1250 このセクションのタイプは
1251 .B SHT_GNU_versym
1252 である。
1253 使用される属性タイプは
1254 .B SHF_ALLOC
1255 である。
1256 .TP
1257 .IR .gnu.version_d
1258 このセクションはバージョンシンボルの定義を保持する。
1259 その内容は
1260 .I ElfN_Verdef
1261 構造体のテーブルである。
1262 このセクションのタイプは
1263 .B SHT_GNU_verdef
1264 である。
1265 使用される属性タイプは
1266 .B SHF_ALLOC
1267 である。
1268 .TP
1269 .IR .gnu.version_r
1270 このセクションはバージョンシンボルが必要とする要素を保持する。
1271 その内容は
1272 .I ElfN_Verneed
1273 構造体のテーブルである。
1274 このセクションのタイプは
1275 .B SHT_GNU_versym
1276 である。
1277 使用される属性タイプは
1278 .B shf_alloc
1279 である。
1280 .TP
1281 .IR .got
1282 このセクションはグローバルオフセットテーブルを保持する。
1283 このセクションのタイプは
1284 .BR SHT_PROGBITS
1285 である。
1286 属性はプロセッサ毎に異なる。
1287 .TP
1288 .IR .hash
1289 このセクションはシンボルハッシュテーブルを保持する。
1290 セクションのタイプは
1291 .BR SHT_HASH
1292 である。
1293 使用される属性は
1294 .BR SHF_ALLOC
1295 である。
1296 .TP
1297 .IR .init
1298 このセクションはプロセス初期化コードに配置される実行可能命令を保持する。
1299 プログラムが実行を開始すると、
1300 システムはメインプログラムエントリポイントを呼び出す前に、
1301 このセクションにあるコードを配置して実行する。
1302 このセクションはのタイプは
1303 .BR SHT_PROGBITS
1304 である。
1305 使用される属性は
1306 .BR SHF_ALLOC
1307
1308 .BR SHF_EXECINSTR
1309 である。
1310 .TP
1311 .IR .interp
1312 このセクションはプログラムインタプリタのパス名を保持する。
1313 ファイルにこのセクションを含むロード可能セグメントがある場合、
1314 そのセクションの属性には
1315 .BR SHF_ALLOC
1316 ビットが含まれる。
1317 それ以外の場合このビットはオフになる。
1318 このセクションのタイプは
1319 .BR SHT_PROGBITS
1320 である。
1321 .TP
1322 .IR .line
1323 このセクションはシンボリックデバッグのための行番号情報を保持する。
1324 ここにはプログラムソースコードとマシンコードの対応関係が記述される。
1325 内容は指定されていない。
1326 このセクションのタイプは
1327 .BR SHT_PROGBITS
1328 である。
1329 属性タイプは使用されない。
1330 .TP
1331 .IR .note
1332 このセクションは以下に記述されている
1333 "Note Section"
1334 形式で情報を保持する。
1335 このセクションのタイプは
1336 .BR SHT_NOTE
1337 である。
1338 属性タイプは使用されない。
1339 通常
1340 OpenBSD
1341 ネイティブ実行可能ファイルは自身を識別するために
1342 .IR .note.openbsd.ident
1343 セクションを持つ。
1344 これによりカーネルは、ファイルをロードする際に
1345 互換 ELF バイナリエミュレーションテストを回避できる。
1346 .TP
1347 .IR .note.GNU-stack
1348 このセクションは Linux のオブジェクトファイルで
1349 スタック属性を宣言するのに使用される。
1350 セクションのタイプは
1351 .B SHT_PROGBITS
1352 である。使用される属性は
1353 .B SHF_EXECINSTR
1354 だけである。この属性は GNU リンカに対して
1355 オブジェクトファイルが実行可能なスタック (executable stack) を必要とする
1356 示すものである。
1357 .TP
1358 .IR .plt
1359 このセクションは手続き (procedure) リンクテーブルを保持する。
1360 このセクションのタイプは
1361 .BR SHT_PROGBITS
1362 である。
1363 属性はプロセッサ毎に異なる。
1364 .TP
1365 .IR .relNAME
1366 このセクションは以下に記述される再配置情報を保持する。
1367 ファイルが再配置を含むロード可能セグメントを持っている場合、
1368 このセクションの属性は
1369 .BR SHF_ALLOC
1370 ビットを含む。
1371 それ以外の場合、そのビットはオフである。
1372 慣例として、
1373 "NAME"
1374 は再配置が適用されるセクションが指定される。
1375 よって
1376 .BR .text
1377 についての再配置セクションは、通常は
1378 .BR .rel.text
1379 という名前を持つ。
1380 このセクションのタイプは
1381 .BR SHT_REL
1382 である。
1383 .TP
1384 .IR .relaNAME
1385 このセクションは以下に記述される再配置情報を保持する。
1386 ファイルが再配置を含むロード可能セグメントを持っている場合、
1387 このセクションの属性は
1388 .BR SHF_ALLOC
1389 ビットを含む。
1390 それ以外の場合、そのビットはオフである。
1391 慣例として、
1392 "NAME"
1393 は再配置が適用されるセクションが指定される。
1394 よって
1395 .BR .text
1396 についての再配置セクションは、通常は
1397 .BR .rela.text
1398 という名前を持つ。
1399 このセクションのタイプは
1400 .BR SHT_RELA
1401 である。
1402 .TP
1403 .IR .rodata
1404 このセクションはリードオンリーのデータを保持する。
1405 このデータはプロセスイメージにおける書き込み不可能なセグメントに置かれる。
1406 このセクションのタイプは
1407 .BR SHT_PROGBITS
1408 である。
1409 使用される属性は
1410 .BR SHF_ALLOC
1411 である。
1412 .TP
1413 .IR .rodata1
1414 このセクションはリードオンリーのデータを保持する。
1415 このデータはプロセスイメージにおける書き込み不可能なセグメントに置かれる。
1416 このセクションのタイプは
1417 .BR SHT_PROGBITS
1418 である。
1419 使用される属性は
1420 .BR SHF_ALLOC
1421 である。
1422 .TP
1423 .IR .shstrtab
1424 このセクションはセクション名を保持する。
1425 このセクションのタイプは
1426 .BR SHT_STRTAB
1427 である。
1428 属性タイプは使用されない。
1429 .TP
1430 .IR .strtab
1431 このセクションは文字列を保持する。
1432 最も一般的なのは、シンボルテーブルエントリに関連づけられた
1433 名前を表す文字列である。
1434 ファイルがシンボル文字列テーブルを含むロード可能セグメントを持つ場合、
1435 セクションの属性は
1436 .BR SHF_ALLOC
1437 ビットを含む。
1438 それ以外の場合、そのビットはオフである。
1439 このセクションのタイプは
1440 .BR SHT_STRTAB
1441 である。
1442 .TP
1443 .IR .symtab
1444 このセクションはシンボルテーブルを保持する。
1445 ファイルがシンボルテーブルを含むロード可能セグメントを持つ場合、
1446 セクションの属性は
1447 .BR SHF_ALLOC
1448 ビットを含む。
1449 それ以外の場合、ビットはオフである。
1450 このセクションのタイプは
1451 .BR SHT_SYMTAB
1452 である。
1453 .TP
1454 .IR .text
1455 このセクションはプログラムの
1456 "テキスト"
1457 または実行可能命令を保持する。
1458 セクションのタイプは
1459 .BR SHT_PROGBITS
1460 である。
1461 使用される属性は
1462 .BR SHF_ALLOC
1463
1464 .BR SHF_EXECINSTR
1465 である。
1466 .\" .El
1467 .PP
1468 文字列テーブルセクションは NULL 文字で終端されたキャラクタ配列
1469 (通常文字列と呼ばれるもの) を保持する。
1470 オブジェクトファイルはこれらの文字列を
1471 シンボル名とセクション名を表すために使う。
1472 文字列は、文字列テーブルセクションへのインデックスとして参照される。
1473 インデックス 0 の最初のバイトは、NULL バイト (\(aq\\0\(aq) を
1474 保持すると定義されている。
1475 同様に文字列テーブルの最後のバイトも NULL 文字を保持すると定義されている。
1476 これは全ての文字列が NULL バイトで終端されていることを保証するためである。
1477 .PP
1478 オブジェクトファイルのシンボルテーブルは、
1479 プログラムのシンボル定義と参照を配置または再配置するのに
1480 必要な情報を保持する。
1481 .in +4n
1482 .nf
1483
1484 typedef struct {
1485     uint32_t      st_name;
1486     Elf32_Addr    st_value;
1487     uint32_t      st_size;
1488     unsigned char st_info;
1489     unsigned char st_other;
1490     uint16_t      st_shndx;
1491 } Elf32_Sym;
1492 .fi
1493 .in
1494 .in +4n
1495 .nf
1496
1497 typedef struct {
1498     uint32_t      st_name;
1499     unsigned char st_info;
1500     unsigned char st_other;
1501     uint16_t      st_shndx;
1502     Elf64_Addr    st_value;
1503     uint64_t      st_size;
1504 } Elf64_Sym;
1505 .fi
1506 .in
1507 .PP
1508 32 ビット版と 64 ビット版は同じメンバを持ち、単に順番が異なるだけである。
1509 .\" .Bl -tag -width "st_value"
1510 .TP 10
1511 .IR st_name
1512 このメンバはオブジェクトファイルのシンボル文字列テーブルの
1513 インデックスを保持する。
1514 シンボル文字列テーブルはシンボル名の文字表現を保持する。
1515 この値が 0 でない場合、シンボル名を得るための文字テーブルインデックスを表す。
1516 それ以外の場合、シンボルテーブルは名前を持たない。
1517 .TP
1518 .IR st_value
1519 このメンバは関連づけられたシンボルの値を表す。
1520 .TP
1521 .IR st_size
1522 多くのシンボルにはそれに関連づけられたサイズがある。
1523 シンボルがサイズを持たない場合、またはサイズが不明な場合、
1524 このメンバは 0 である。
1525 .TP
1526 .IR st_info
1527 このメンバはシンボルのタイプとバインディング (binding) 属性を指定する:
1528 .RS 10
1529 .TP 12
1530 .BR STT_NOTYPE
1531 シンボルのタイプが定義されていない。
1532 .TP
1533 .BR STT_OBJECT
1534 シンボルはデータオブジェクトに関連づけられている。
1535 .TP
1536 .BR STT_FUNC
1537 シンボルは関数またはその他の実行コードに関連づけられている。
1538 .TP
1539 .BR STT_SECTION
1540 シンボルはセクションに関連づけられている。
1541 このタイプのシンボルテーブルエントリは、
1542 主として再配置のために存在し、通常は
1543 .BR STB_LOCAL
1544 バインディングを持つ。
1545 .TP
1546 .BR STT_FILE
1547 慣例として、シンボルの名前は
1548 オブジェクトファイルに関連づけられたソースファイルの名前を指定する。
1549 ファイルシンボルは
1550 .BR STB_LOCAL
1551 バインディングを持ち、そのセクションインデックスは
1552 .BR SHN_ABS
1553 である。
1554 ファイルシンボルは、ファイルに他の
1555 .BR STB_LOCAL
1556 シンボルがある場合は、それよりも先に来る。
1557 .TP
1558 .BR STT_LOPROC
1559 この値以上で
1560 .BR STT_HIPROC
1561 以下の範囲はプロセッサ固有の意味に予約されている。
1562 .TP
1563 .BR STT_HIPROC
1564 この値以下で
1565 .BR STT_LOPROC
1566 以上の範囲はプロセッサ固有の意味に予約されている。
1567 .\" .El
1568 .\" .Bl -tag -width "STB_GLOBAL"
1569 .TP
1570 .BR STB_LOCAL
1571 局所的シンボルはその定義を含むオブジェクトファイルの外からは見えない。
1572 同じ名前の局所的シンボルは、お互いに影響を受けることなく、
1573 複数のファイルに存在できる。
1574 .TP
1575 .BR STB_GLOBAL
1576 大域的シンボルは結びつけられている全てのオブジェクトファイルから見える。
1577 1 つのファイルで大域的シンボルが定義されていたら、
1578 他のファイルでは同じシンボルへの参照は未定義でなければならない。
1579 .TP
1580 .BR STB_WEAK
1581 弱シンボルは大域的シンボルに似ているが、その定義は優先度が低い。
1582 .TP
1583 .BR STB_LOPROC
1584 この値以上で
1585 .BR STB_HIPROC
1586 以下の範囲はプロセッサ固有の意味に予約されている。
1587 .TP
1588 .BR STB_HIPROC
1589 この値以下で
1590 .BR STB_LOPROC
1591 以上の範囲はプロセッサ固有の意味に予約されている。
1592 .IP
1593 バインディングとタイプフィールドを
1594 パックしたりアンパックしたりするマクロがある:
1595 .IP
1596 .BR ELF32_ST_BIND (info)
1597 または
1598 .BR ELF64_ST_BIND (info)
1599 .I st_info
1600 の値からバインディングを取り出す。
1601 .IP
1602 .BR ELF32_ST_TYPE (info)
1603 または
1604 .BR ELF64_ST_TYPE (info)
1605 .br
1606 .I st_info
1607 の値からタイプを取り出す。
1608 .IP
1609 .BR ELF32_ST_INFO "(bind, type)"
1610 または
1611 .BR ELF64_ST_INFO "(bind, type)"
1612 .br
1613 バインディングとタイプを
1614 .I st_info
1615 の値に変換する。
1616 .RE
1617 .\" .El
1618 .TP
1619 .IR st_other
1620 このメンバはシンボルの visibility (見える範囲) を規定する。
1621 .\" .Bl -tag -width "STV_PROTECTED"
1622 .RS 10
1623 .TP 16
1624 .PD 0
1625 .BR STV_DEFAULT
1626 デフォルトのシンボル visibility ルール。
1627 .TP
1628 .BR STV_INTERNAL
1629 プロセッサ固有の隠しクラス。
1630 .TP
1631 .BR STV_HIDDEN
1632 シンボルは他のモジュールからは利用できない。
1633 .TP
1634 .BR STV_PROTECTED
1635 横取りできず (not preemptible)、公開されない。
1636 .PD
1637 .PP
1638 visibility 種別を抽出するためのマクロがある。
1639 .PP
1640 .BR ELF32_ST_VISIBILITY (other)
1641 または
1642 .BR ELF64_ST_VISIBILITY (other)
1643 .RE
1644 .\" .El
1645 .TP
1646 .IR st_shndx
1647 各シンボルテーブルエントリは、いくつかのセクションに関連して
1648 "定義されている"。
1649 このメンバは関連するセクションヘッダテーブルインデックスを保持する。
1650 .\" .El
1651 .PP
1652 再配置はシンボル参照とシンボル定義を結合するプロセスである。
1653 再配置可能ファイルはセクションの内容をどのように修正するかに関する
1654 情報を持たなければならない。
1655 これにより、実行可能ファイルと共有オブジェクトファイルは
1656 プロセスのプログラムイメージについての正しい情報を持つことができる。
1657 再配置エントリは以下のようなデータである。
1658 .PP
1659 加数を必要としない再配置構造体。
1660 .in +4n
1661 .nf
1662
1663 typedef struct {
1664     Elf32_Addr r_offset;
1665     uint32_t   r_info;
1666 } Elf32_Rel;
1667 .fi
1668 .in
1669 .in +4n
1670 .nf
1671
1672 typedef struct {
1673     Elf64_Addr r_offset;
1674     uint64_t   r_info;
1675 } Elf64_Rel;
1676 .fi
1677 .in
1678 .PP
1679 加数を必要とする再配置構造体。
1680 .in +4n
1681 .nf
1682
1683 typedef struct {
1684     Elf32_Addr r_offset;
1685     uint32_t   r_info;
1686     int32_t    r_addend;
1687 } Elf32_Rela;
1688 .fi
1689 .in
1690 .in +4n
1691 .nf
1692
1693 typedef struct {
1694     Elf64_Addr r_offset;
1695     uint64_t   r_info;
1696     int64_t    r_addend;
1697 } Elf64_Rela;
1698 .fi
1699 .in
1700 .\" .Bl -tag -width "r_offset"
1701 .TP 12
1702 .IR r_offset
1703 このメンバは再配置動作が適用される位置を与える。
1704 再配置可能ファイルの場合、この値はセクションの先頭から
1705 再配置で影響を受ける格納単位 (storage unit) までのバイトオフセットである。
1706 実行可能ファイルまたは共有オブジェクトの場合、
1707 この値は再配置で影響を受ける格納単位の仮想アドレスである。
1708 .TP
1709 .IR r_info
1710 このメンバは、再配置が行われなければならないシンボルテーブルインデックスと、
1711 適用される再配置のタイプの両方を与える。
1712 再配置タイプはプロセッサ毎に異なる。
1713 テキストが再配置エントリの再配置タイプ
1714 またはシンボルテーブルインデックスを参照している場合、
1715 それぞれエントリの
1716 .IR r_info
1717 メンバに対して、それぞれ
1718 .BR ELF_[32|64]_R_TYPE
1719
1720 .BR ELF[32|64]_R_SYM
1721 を適用した結果を意味する。
1722 .TP
1723 .IR r_addend
1724 このメンバは定数の加数を指定する。
1725 この加数は再配置可能フィールドに格納される値を計算するために使われる。
1726 .\" .El
1727 .PP
1728 \&.dynamic セクションは、関連する動的リンク情報を保持している
1729 一連の構造体を保持する。
1730 d_tag メンバは d_un の解釈を制御する。
1731 .in +4n
1732 .nf
1733
1734 typedef struct {
1735     Elf32_Sword    d_tag;
1736     union {
1737         Elf32_Word d_val;
1738         Elf32_Addr d_ptr;
1739     } d_un;
1740 } Elf32_Dyn;
1741 extern Elf32_Dyn _DYNAMIC[];
1742 .fi
1743 .in
1744 .in +4n
1745 .nf
1746
1747 typedef struct {
1748     Elf64_Sxword    d_tag;
1749     union {
1750         Elf64_Xword d_val;
1751         Elf64_Addr  d_ptr;
1752     } d_un;
1753 } Elf64_Dyn;
1754 extern Elf64_Dyn _DYNAMIC[];
1755 .fi
1756 .in
1757 .\" .Bl -tag -width "d_tag"
1758 .TP 10
1759 .IR d_tag
1760 このメンバは以下の値を持つことができる:
1761 .\" .Bl -tag -width "DT_SYMBOLIC"
1762 .RS 10
1763 .TP 12
1764 .BR DT_NULL
1765 動的セクションの終りのマーク
1766 .TP
1767 .BR DT_NEEDED
1768 必要なライブラリの名前への文字列テーブルオフセット
1769 .TP
1770 .BR DT_PLTRELSZ
1771 PLT 再配置 (reloc) テーブルのサイズ (バイト単位)
1772 .TP
1773 .BR DT_PLTGOT
1774 PLT と GOT (または何れか一方) のアドレス
1775 .TP
1776 .BR DT_HASH
1777 シンボルハッシュテーブルのアドレス
1778 .TP
1779 .BR DT_STRTAB
1780 文字列テーブルのアドレス
1781 .TP
1782 .BR DT_SYMTAB
1783 シンボルテーブルのアドレス
1784 .TP
1785 .BR DT_RELA
1786 Rela 再配置テーブルのアドレス
1787 .TP
1788 .BR DT_RELASZ
1789 Rela テーブルのサイズ (バイト単位)
1790 .TP
1791 .BR DT_RELAENT
1792 Rela テーブルエントリのサイズ (バイト単位)
1793 .TP
1794 .BR DT_STRSZ
1795 文字列テーブルのサイズ (バイト単位)
1796 .TP
1797 .BR DT_SYMENT
1798 シンボルテーブルエントリのサイズ (バイト単位)
1799 .TP
1800 .BR DT_INIT
1801 初期化関数のアドレス
1802 .TP
1803 .BR DT_FINI
1804 終了関数のアドレス
1805 .TP
1806 .BR DT_SONAME
1807 共有オブジェクトの名前への文字列テーブルオフセット
1808 .TP
1809 .BR DT_RPATH
1810 ライブラリ検索パスへの文字列テーブルオフセット (推奨されない)
1811 .TP
1812 .BR DT_SYMBOLIC
1813 リンカがシンボルの実行可能ファイルより前に
1814 この共有オブジェクトを検索した場合は、警告を出す。
1815 .TP
1816 .BR DT_REL
1817 Rel 再配置テーブルのアドレス
1818 .TP
1819 .BR DT_RELSZ
1820 Rel テーブルのサイズ (バイト単位)
1821 .TP
1822 .BR DT_RELENT
1823 Rel テーブルエントリのサイズ (バイト単位)
1824 .TP
1825 .BR DT_PLTREL
1826 PLT が参照する再配置テーブルのタイプ (Rela または Rel)
1827 .TP
1828 .BR DT_DEBUG
1829 デバッグのために使用されている。内容は定義されていない。
1830 .TP
1831 .BR DT_TEXTREL
1832 これが指定されていない場合、
1833 書き込み不可のセグメントには再配置は適用されない。
1834 .TP
1835 .BR DT_JMPREL
1836 PLT 専用の再配置エントリのアドレス
1837 .TP
1838 .BR DT_BIND_NOW
1839 実行可能ファイルに制御を譲る前に、
1840 全ての再配置を処理するように動的リンカに指示する。
1841 .TP
1842 .BR DT_RUNPATH
1843 ライブラリ検索パスへの文字列テーブルオフセット
1844 .TP
1845 .BR DT_LOPROC
1846 プロセッサ固有の意味の開始
1847 .TP
1848 .BR DT_HIPROC
1849 プロセッサ固有の意味の終了
1850 .RE
1851 .\" .El
1852 .TP
1853 .IR d_val
1854 このメンバは様々な意味に解釈される整数値である。
1855 .TP
1856 .IR d_ptr
1857 このメンバはプログラムの仮想アドレスを表す。
1858 これらのアドレスを解釈する際に、
1859 実際のアドレスは元々のファイルの値と
1860 メモリの基底アドレスから計算される。
1861 ファイルにはこれらのアドレスを修正するための
1862 再配置エントリを含めてはならない。
1863 .TP
1864 .IR _DYNAMIC
1865 \&.dynamic セクションにある全ての動的構造体を含む配列。
1866 これは自動的にリンカに渡される。
1867 .\" .El
1868 .SH 備考
1869 .\" OpenBSD
1870 .\" ELF のサポートは
1871 .\" OpenBSD 1.2
1872 .\" で初めて登場した。
1873 .\" しかし、これをサポートするプラットフォームの全てが
1874 .\" ネイティブバイナリファイルフォーマットとして使っていた訳ではない。
1875 ELF は System V で初めて登場した。
1876 ELF 自体は
1877 System V
1878 で初めて登場した。
1879 ELF フォーマットは採択された標準である。
1880 .\" .SH 著者
1881 .\" この man ページの元々のバージョンは、BSDi の
1882 .\" .Bsx
1883 .\" .Nm elf
1884 .\" man ページに刺激を受けて
1885 .\" .An Jeroen Ruigrok van der Werven
1886 .\" .Aq asmodai@FreeBSD.org
1887 .\" が書いた。
1888 .SH 関連項目
1889 .BR as (1),
1890 .BR gdb (1),
1891 .BR ld (1),
1892 .BR objdump (1),
1893 .BR execve (2),
1894 .BR core (5)
1895 .PP
1896 Hewlett-Packard,
1897 .IR "Elf-64 Object File Format" .
1898 .PP
1899 Santa Cruz Operation,
1900 .IR "System V Application Binary Interface" .
1901 .PP
1902 Unix System Laboratories,
1903 "Object Files",
1904 .IR "Executable and Linking Format (ELF)" .