OS自作入門 3日目C関数コンパイルするときつけるオプション-Tとlinker script #osdevjp
30日でできる!OS自作入門(3日目)[Ubuntu16.04/NASM] - Qiita
↑を参考に。
linker scriptはここが大本っぽい 『30日でできる!OS自作入門』のメモ
まずgccの-T
オプションでhar.ld指定しているけど、Tオプションとは
-T script Use script as the linker script. This option is supported by most systems using the GNU linker. On some targets, such as bare-board targets without an operating system, the -T option may be required when linking to avoid references to undefined symbols. Using the GNU Compiler Collection (GCC): Link Options
リンカースクリプトはここ由来っぽい。ありがてえ。。 vanya.jp.net
ldのマニュアル Top (LD)
なるほどリンカーコマンド言語
ld accepts Linker Command Language files written in a superset of AT&T’s Link Editor Command Language syntax, to provide explicit and total control over the linking process.
ついでにマニュアル何ページか読む
LinkerScriptわからんのでコンセプト読んでみた
オブジェクトはsectionで出来ててobjdumpにhオプションつけると見れる
やってみた(途中まではる)
% objdump -h bin/mruby bin/mruby: ファイル形式 elf64-x86-64 セクション: 索引名 サイズ VMA LMA File off Algn 0 .init 00000003 0000000000400120 0000000000400120 00000120 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .text 0006f8e0 0000000000400130 0000000000400130 00000130 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 2 .fini 00000003 000000000046fa10 000000000046fa10 0006fa10 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 3 .rodata 00022578 000000000046fa20 000000000046fa20 0006fa20 2**5 CONTENTS, ALLOC, LOAD, READONLY, DATA
nmコマンドでシンボルとれるらしい
You can see the symbols in an object file by using the nm program, or by using the objdump program with the ‘-t’ option.
やってみる、お、見慣れた名前だ
% nm bin/mruby | tail 0000000000444bd0 t yyparse 00000000004896c0 r yypgoto 000000000047dac0 r yyr1 000000000047d860 r yyr2 000000000043fbd0 t yysyntax_error 0000000000483a60 r yytable 000000000048a860 r yytname 000000000048b280 r yytranslate 000000000043f490 t yywarn 000000000043f5e0 t yywarning_s
LinkerScriptのマニュアル読み進めていく、OUTPUT_FORMATでてきた!!!
The OUTPUT_FORMAT command names the BFD format to use for the output file (see BFD). Format Commands (LD)
、objdump -i
でOUTPUT_FORMAT
で使えるフォーマットが取れるっぽい
You can use objdump -i (see objdump in The GNU Binary Utilities) to list all the formats available for your configuration. BFD (LD)
% objdump -i BFD ヘッダファイルバージョン (GNU Binutils for Debian) 2.28 elf64-x86-64 (header little endian, data little endian) i386 elf32-i386 (header little endian, data little endian) i386 elf32-iamcu (header little endian, data little endian) iamcu elf32-x86-64 (header little endian, data little endian) i386 a.out-i386-linux (header little endian, data little endian) i386 pei-i386 (header little endian, data little endian) i386 pei-x86-64 (header little endian, data little endian) i386 elf64-l1om (header little endian, data little endian) l1om elf64-k1om (header little endian, data little endian) k1om elf64-little (header little endian, data little endian) i386 l1om k1om iamcu plugin elf64-big (header big endian, data big endian) i386 l1om k1om iamcu plugin elf32-little (header little endian, data little endian) i386 l1om k1om iamcu plugin elf32-big (header big endian, data big endian) i386 l1om k1om iamcu plugin pe-x86-64 (header little endian, data little endian) i386 pe-bigobj-x86-64 (header little endian, data little endian) i386 pe-i386 (header little endian, data little endian) i386 plugin (header little endian, data little endian) srec (header endianness unknown, data endianness unknown) i386 l1om k1om iamcu plugin symbolsrec (header endianness unknown, data endianness unknown) i386 l1om k1om iamcu plugin verilog (header endianness unknown, data endianness unknown) i386 l1om k1om iamcu plugin tekhex (header endianness unknown, data endianness unknown) i386 l1om k1om iamcu plugin binary (header endianness unknown, data endianness unknown) i386 l1om k1om iamcu plugin ihex (header endianness unknown, data endianness unknown) i386 l1om k1om iamcu plugin elf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 a.out-i386-linux i386 elf64-x86-64 elf32-i386 ----------- elf32-x86-64 a.out-i386-linux l1om ------------ ---------- ----------- ------------ ---------------- k1om ------------ ---------- ----------- ------------ ---------------- iamcu ------------ ---------- elf32-iamcu ------------ ---------------- plugin ------------ ---------- ----------- ------------ ---------------- pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big i386 pei-i386 pei-x86-64 ---------- ---------- elf64-little elf64-big l1om -------- ---------- elf64-l1om ---------- elf64-little elf64-big k1om -------- ---------- ---------- elf64-k1om elf64-little elf64-big iamcu -------- ---------- ---------- ---------- elf64-little elf64-big plugin -------- ---------- ---------- ---------- elf64-little elf64-big elf32-little elf32-big pe-x86-64 pe-bigobj-x86-64 pe-i386 plugin srec i386 elf32-little elf32-big pe-x86-64 pe-bigobj-x86-64 pe-i386 ------ srec l1om elf32-little elf32-big --------- ---------------- ------- ------ srec k1om elf32-little elf32-big --------- ---------------- ------- ------ srec iamcu elf32-little elf32-big --------- ---------------- ------- ------ srec plugin elf32-little elf32-big --------- ---------------- ------- ------ srec symbolsrec verilog tekhex binary ihex i386 symbolsrec verilog tekhex binary ihex l1om symbolsrec verilog tekhex binary ihex k1om symbolsrec verilog tekhex binary ihex iamcu symbolsrec verilog tekhex binary ihex plugin symbolsrec verilog tekhex binary ihex
SECTIONS
はこれ
文法
SECTIONS { sections-command sections-command … }
.head
とかの記法はこれ
Output Section Description (LD)
The full description of an output section looks like this: section [address] [(type)] : [AT(lma)] [ALIGN(section_align) | ALIGN_WITH_INPUT] [SUBALIGN(subsection_align)] [constraint] { output-section-command output-section-command … } [>region] [AT>lma_region] [:phdr :phdr …] [=fillexp] [,]
LONGとかはこれ
ADDR, SIZEOF, LOADADDRは組み込み関数 Builtin Functions (LD)
ATはキーワード
The AT keyword takes an expression as an argument. This specifies the exact load address of the section. Output Section LMA (LD)
というかさっきのSECTIONSの構文にちゃんと登場しとる
このhar.ldざっとみたかんじ
30日でできる!OS自作入門(3日目)[Ubuntu16.04/NASM] - Qiita
3つセクションがある
.head
セクション.text
セクション.data
セクション
はじまりの位置
.head
セクションは0x00からはじまる。.data
セクションは0x31000000から
VMA/LMAの対応はこのページの疑似コードが分かりやすい、ROMからコピー
*(.data)
は全ての入力ファイルにマッチするので*
、そのなかの.data
セクション全てを表してるっぽい
DISCARDはとくべつで、ここにマッチしたセクションは破棄されるっぽい Output Section Discarding (LD)
つまり.eh_frame
のセクションが捨てられる
eh_frame
はerror handling frameの略なのかな、C++の例外の解決に使われるよう
.rodata
は定数が入るっぽい
.bss
は0初期化されてる値、なるほど
BSSはBlock Started by Symbolというアセンブラの疑似命令に由来する。 BSSはBlock Started by Symbolというアセンブラの疑似命令に由来する。
一応命令一通りマニュアルみてみたけど、自分で書けるかというとびみょうそう。
このページすごいべんりだ... 『30日でできる!OS自作入門』のメモ