本を読んでいます本ELFに関する話です。これが実行可能ファイルのファイル形式であることがわかります。仮想マシンでコマンドを実行しましたが、その機能を理解できませんでした。
objcopy -O binary -j .interp /bin/ls /dev/stdout
実行後にファイルを開いて/dev/stdout
みると、一種のログ情報のように見えます。
答え1
UnixとLinux SEへようこそ!
ELFファイルには、1つまたは2つのバイナリヘッダーと多くの名前付きセクションがあります。興味があれば、WikipediaにELFファイル構造の説明があります。
あなたのコマンドはobjcopy -O binary -j .interp /bin/ls /dev/stdout
ファイル部分の内容をそのまま「ファイル」として出力します()。.interp
/bin/ls
-O binary
/dev/stdout
/dev/stdout
現在のプロセス(つまり、標準出力ストリーム)のファイル記述子#1を指すシンボリックリンクでなければなりません。これは、デフォルトで出力を指定されたファイルに書き込んで、標準出力を使用するようにプログラムに指示する方法です。一部のプログラムでは、出力ファイル名をjustとして指定することで-
これを行うことができますが、明らかにobjcopy
その規則に従わないことがあります。
開いたときに「ある種のログメッセージ」が表示された場合は、/dev/stdout
おそらくシンボリックリンクがルートとして実行されているいくつかのプログラムまたはスクリプトによって誤って置き換えられたということです。次のようにする必要があります。
$ ls -l /dev/stdout
lrwxrwxrwx 1 root root 15 Nov 17 23:25 /dev/stdout -> /proc/self/fd/1
64ビットx86システムでは、objcopy
コマンドは次のように出力する必要があります/lib64/ld-linux-x86-64.so.2
。出力の末尾に改行文字が含まれていないため、次のコマンドプロンプトと同じ行に表示される可能性があるため、見つけるのは難しいです。
[my command prompt]$ objcopy -O binary -j .interp /bin/ls /dev/stdout
/lib64/ld-linux-x86-64.so.2[my command prompt]$
32ビットx86バイナリからの出力は/lib/ld-linux.so.2
。
出力はファイル名ですプログラム通訳また〜として知られています動的リンカー/ローダーチェックされたバイナリと一緒に使用する必要があります。システムまたはコマンドを使用して、man ld.so
これに関する詳細情報を取得できます。man ld-linux