FromNandの日記

自分的備忘録

2019-11-01から1ヶ月間の記事一覧

リンカスクリプトで変数を定義し、それをCファイルで参照する方法

リンカスクリプトで変数を宣言するには ・.(ロケーションカウンダ)をインクリメントする方法 ・BYTE()、SHORT()、LONG()などのビルトイン関数を使う方法 の主に二つが存在する。 前者は初期値を設定しなくてよい場合に手頃だが、初期値も欲しい場合は後者を…

リンカスクリプトにおけるMEMORYコマンドの使い方

具体的に言うと「MEMORYコマンド」を使うらしい。 MEMORYコマンドとはこんなやつ MEMORY{ PHDR (r) : ORIGIN = 0x8048000, LENGTH = _elf_header_size TEXT (rx) : ORIGIN = ORIGIN(PHDR) + LENGTH(PHDR), LENGTH = 0x2000 - _elf_header_size RODATA (r) : …

リンカスクリプトのシンボル機能を使って各セクションのアドレスを表示してみる

リンカスクリプトにはいろいろな面白い機能がある。 今回はシンボルをリンカスクリプトで定義して、それをC言語側の関数から表示してみたい。 まず、リンカスクリプトはこれ。 SECTIONS{ . = 0x8048000 + SIZEOF_HEADERS; .text : { stext = .; *(.text) ete…

【GASアセンブラ】わかりにくい文法や豆知識を自分なりにまとめておく

・バイナリに特定のデータを詰め込む .skip n(, fill) .space n(, fill) ・文字列をバイナリに埋め込む .ascii "abc" (nullターミネートなし) .asciz "abc" (nullターミネートあり) .string "abc" (nullターミネートあり) https://stackoverflow.com/questio…

再配置可能コード(リロケータブルコード)と位置独立コード(PIC)の違いと解説

【解説】 そもそも、なんでこれらが必要になったのか? それは、昔はMMU(動的アドレス変換)などがなかったので、絶対アドレスを指定してしまうと、本当にそのアドレスでしか実行できなかった。 これは、アドレスが重複する2つのプログラムが同時に実行できな…

【ELF解析】ELF形式のバイナリを解析する際の手順について

ELF形式の解析を行う際の手順をまとめておきます。 まず、main関数で解析対象のバイナリをfopenします。 そしてfstatやmmapを利用してベタバイナリをメモリに確保したあと、ようやく解析が始まります。 int fd; struct stat sb; char *head; // 対象のELF形…