プロが教えるわが家の防犯対策術!

テキスト通りの608バイト程度の実行ファイルを作成する手順、教えてください

「Linux で64bitアセンブリプログラミング (01)」
https://www.mztn.org/lxasm64/amd01.html
の例題のアセンブラ(nasm) を使ったプログラム
hello.s
の実行形式が、テキストでは
-rwxr-xr-x 1 jun jun 608 2009-04-03 01:21 hello
となっていますが、
私の環境 Ubuntu20.04 で実行すると
-rwxrwxr-x 1 usa usa 8488 3月 1 18:00 hello01
となって、10倍以上のファイルサイズになってしまいます。

多少のサイズ違いなら、OSのバージョンの違いかなと思いますが、
今回はあまりにも違いすぎます。何が原因でしょうか?
やったことは、テキスト通りに
hello.s
を作成して
$ nasm -f elf64 hello.s
$ ld -s -o hello hello.o
を実行しただけです。

よろしくお願いします

A 回答 (2件)

今のx86-64 ELF実行形式は8kBより小さくならないかもしれませんね。


/bin/下のコマンドをfileコマンドでみてみると、14kBより小さいファイルはELFじゃなくてスクリプトでしたし。
ELFを実行するならファイルをそのままメモリ空間にマッピングして、ダイナミックリンク部分だけ書き換えた上でコード空間にアサインすると考えられます。コードとヘッダや初期化データは仮想ページを分けたいと考えると少なくとも2つ以上のページが必要になるので、これを手軽にと考えるとヘッダやコードとデータの間に適当なパディングをしてファイルが大きくなることが考えられます。objdumpやhexdumpでELFバイナリの構造を確認すると良いかと思います。
ldにパディングせずにサイズを小さくするオプションがある可能性もありますが、ローダーの手間が増えるのでなくなっていても不思議はありません。
リンク先URLの時期から10年以上経ってますし。
    • good
    • 0
この回答へのお礼

解説ありがとうございます。
どうやら仰るとおりのようです。新しいバージョンのLINUXではテキスト通りの1KB程度の実行ファイルは無理なようですね。

お礼日時:2024/03/11 08:29

>テキスト通りの608バイト程度の実行ファイルを作成する手順、教えてください


古〜い ディストリでやればいいんじゃないですか…
    • good
    • 0
この回答へのお礼

回答ありがとうございます
>古〜い ディストリでやればいいんじゃないですか…
なるほど。

ということでやってみました
Ubuntu8.04
古すぎるのか、nasmがインストールできず断念。

Ubuntu16.04
928 バイト
でかなり小さくなりました!

Ubuntu20.04 で小さくする方法、ありませんか?

お礼日時:2024/03/03 18:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A