C 言語プログラムを実行するまでになにがおこなわれるか

hexdump とは?

url: https://hana-shin.hatenablog.com/entry/2022/03/31/200457
title: "hexdumpコマンドの使い方 - hana_shinのLinux技術ブログ"
description: "1 hexdumpコマンドとは? 2 検証環境 3 オプション一覧 4 事前準備 5 オプションなしで実行した場合 6 ASCII文字を表示する方法(-C) 7 表示する範囲を指定する方法 7.1 先頭からnバイトを表示する方法 7.2 sバイト目からnバイトを表示する方法 7.3 sバイト目から最後まで表示する方法 8 繰り返し部分を表示する方法(-v) Z 参考情報 1 hexdumpコマンドとは? ファイルの内容を8進数や16進数で表示するコマンドです。 2 検証環境 CentOS版数は以下のとおりです。仮想マシンは最小構成で作成しました。 [root@server ~]# cat /e…"
host: hana-shin.hatenablog.com
favicon: https://hana-shin.hatenablog.com/icon/link
image: https://ogimage.blog.st-hatena.com/17680117127115851806/13574176438078526916/1648727335
url: https://xtech.nikkei.com/it/article/COLUMN/20140224/538591/
title: "【hexdump】16進数や8進数で出力する"
description: "バイナリ・ファイルなどの入力データを、16進数や8進数をはじめ、ユーザーの指定した形式で出力する。デフォルトでは、2バイト単位の16進数4桁で出力する。"
host: xtech.nikkei.com
image: https://xtech.nikkei.com/images/n/xtech/2020/ogp_nikkeixtech_hexagon.jpg?20220512

hexdump とは binary ファイルデータを hexadecimaloctal ascii として表示し、バイナリファイルの中身を確認するコマンドです。

使ってみる

Hello, World!\x98\x99\x98\x99\aa が書かれたファイルを作成して、それを hexdump で見てみます。 \x98\x99\aa はエディタでは識別できない 16 進数となります。

echo で -e をつけることで escape-sequence を解釈させられます。 \x48 を 1 byte の文字として解釈させ、 H としてターミナルで表示します。 \x98 については ascii としては無効の文字です。そのため、 U+FFFD = � として表示されます。

echo -en "\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\x98\x99\x98\x99\xaa" > test1.bin
 
 file test1.bin
test1.bin: Non-ISO extended-ASCII text, with no line terminators

hexdump でよく使う形式は以下です。 これにくわえて 8 進数の表記 (-b) もおこなえます。

 hexdump test1.bin
0000000 6548 6c6c 2c6f 5720 726f 646c 9821 9899
0000010 aa99
0000012
 
playground/c-compile-assemble on feature/learn-c-compile-assemble [?] via C v17.0.0-clang [☁️ ]
 hexdump -c test1.bin
0000000   H   e   l   l   o   ,       W   o   r   l   d   ! 230 231 230
0000010 231
0000012
 
playground/c-compile-assemble on feature/learn-c-compile-assemble [?] via C v17.0.0-clang [☁️ ]
 hexdump -C test1.bin
00000000  48 65 6c 6c 6f 2c 20 57  6f 72 6c 64 21 98 99 98  |Hello, World!...|
00000010  99 aa                                             |..|
00000012

一番使いやすい -C (Canonical) に注目します。 echo で出力した際の \x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\x98\x99\x98\x99\xaa\ が順番に表示されており、またそれを ASCII 表示したものが右端に表示されています。 また、 印字可能でない(制御文字・非印字文字・ASCII の範囲外)のバイトの場合は . として表示されています。

縦の 00000010 はバイト単位のアドレスであり、 0x10 = 16 番地を表しています。

playground/c-compile-assemble on feature/learn-c-compile-assemble [?] via C v17.0.0-clang [☁️ ]
 hexdump -C test1.bin
00000000  48 65 6c 6c 6f 2c 20 57  6f 72 6c 64 21 98 99 98  |Hello, World!...|
00000010  99 aa                                             |..|
00000012

C のオブジェクトファイルを見てみる

C 言語プログラムを実行するまでになにがおこなわれるか で生成した main.o を hexdump で見てみます。