目次: ベンチマーク
以前(2025年2月7日の日記参照)100万回のHello, World!を104バイトまで削りました。あれはなかなか楽しかったです。
バイナリを使わずにどこまで削れるか?は一部やっている(2024年2月25日の日記参照)のですが、スタート地点が謎のバイナリ埋め込みしたコードだったので、もうちょっとC言語寄りのコードでやってみました。100万回のHello, World!ではなく、1回だけのHello, World!にします。
一般的なprintfを使ったコードでやってみます。
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello, World!\n");
return 0;
}
スタティックリンクします。
$ gcc -static -Os b.c $ strip -s a.out $ ./a.out Hello, World! $ ls -la -rwxr-xr-x 1 katsuhiro 1003 676288 Jul 20 2025 a.out
676KBでした。思っていたよりサイズがでかいです。libcがいるのである程度のサイズになるのは仕方ないでしょう。この方向でサイズを削るのもやってみたいですけど、libcを変えてみるくらいしか思いつきません。
サイズ肥大の要因libcにさようならをするため、writeシステムコールとexitシステムコールを直接叩くコードに変えます。黒魔術感がマシマシで、C言語の範疇といえるか微妙なラインです。
#define SYS_write 1
#define SYS_exit 60
#define fd_stdout 1
const char str[] __attribute__((section(".text"))) = "Hello, World!\n";
static void syscall(long n, long a1, long a2, long a3)
{
__asm__ volatile (
"mov %0, %%rax\n\t"
"mov %1, %%rdi\n\t"
"mov %2, %%rsi\n\t"
"mov %3, %%rdx\n\t"
"syscall\n\t"
: : "r"(n), "r"(a1), "r"(a2), "r"(a3) : "rax", "rdi", "rsi", "rdx"
);
}
void _start()
{
syscall(SYS_write, fd_stdout, (long)str, sizeof(str) - 1);
syscall(SYS_exit, 0, 0, 0);
}
特に工夫せずにビルド+stripすると8752バイト(約8KB)となります。
$ gcc -static -nostdlib a.c /tmp/cchcRI2o.s: Assembler messages: /tmp/cchcRI2o.s:4: Warning: ignoring changed section attributes for .text $ strip -s a.out $ ./a.out Hello, World! $ ls -l a.out -rwxr-xr-x 1 katsuhiro 1003 8752 Jul 20 2025 a.out
あとは前回調べた工夫を全部使います。以前は使っていなかった-fno-asynchronous-unwind-tablesは.eh_frameセクションを削るためのものです。
$ gcc -static -nostdlib \ -Wl,-Ttext=0x400100 \ -fno-asynchronous-unwind-tables \ -Wl,--build-id=none \ -fno-ident \ -Os \ a.c /tmp/ccKkgbPV.s: Assembler messages: /tmp/ccKkgbPV.s:34: Warning: ignoring changed section attributes for .text $ strip -s a.out $ ./a.out Hello, World! $ ls -l a.out -rwxr-xr-x 1 katsuhiro 1003 536 Jul 20 2025 a.out
だいぶ減って536バイト、バイナリを一切触らずサイズを削れました。これより短くする場合は、コードを短くする(write = systemcall3, exit = systemcall0に分けてmov命令を削るなど)、セクションをさらに削る方法を探すくらいでしょうか。C言語だと結構難しそうではあります。
この記事にコメントする
目次: 車
車を買い替えることにしました。来週のどこかでレガシィさんとはお別れとなります。新車登録が2005年、私が購入したのが2010年で、20年近く頑張ってくれて感謝しかありません。レガシィB4、とても良い車です。ありがとうスバルさん。
私が乗っているグレードは2.0 GTで、2L水平対向4気筒ターボ、260psを発揮します。3000rpmくらいから後ろから押されるような力強い加速をするのが印象的です。たぶん私はこの車の本気の力を使ってないですが、それでも合流、上り坂、追い抜きで苦労した記憶はありません。ハンドルが重めになっていて、足回りはセダンにしてはやや固めです、それが良いところでもありますね。
購入当時はターボ車が減りつつありターボ車はいずれ滅びると思いましたが、2010年くらいからダウンサイジングターボが大流行して今はNA車と半々くらいの勢いになっています。世の中は何が起きるかわからないものです。
無茶な運転はしてませんが、10年間一度もぶつけなかった壁に最後の日(大阪から東京に引っ越し移動の日)に限ってぶつけたり、リアバンパーもぶつけて取れてしまったり、だいぶベコベコになりました。次こそぶつけないように気を付けます……けど、いつかぶつけるんだろうな〜。
大阪は走ってもあまり面白くないのと、車に乗る用事もほぼありませんでした。東京もコロナ、リモートワーク、駐車場が結構遠いなどなど、ほとんど車に乗りませんでした。乗らなさすぎてバッテリーが何度も上がりましたし、もう車は要らないかなあ?とすら思いました。
駐車場に空きが出て近いところに止められるようになり、転職してから東京の会社には珍しく車通勤できるので車に頻繁に乗るようになりました。必要があれば乗るんだなと自分でも驚きました……。
この記事にコメントする
| < | 2025 | > | ||||
| << | < | 07 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| - | - | 1 | 2 | 3 | 4 | 5 |
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | 31 | - | - |
26年3月10日
22年4月13日
07年11月1日
21年5月22日
26年3月2日
20年10月23日
18年7月21日
02年11月22日
22年11月11日
07年11月2日
23年4月10日
15年11月22日
23年9月11日
18年5月2日
18年9月16日
24年9月20日
14年1月26日
26年2月23日
21年12月28日
26年2月15日
wiki
Linux JM
Java API
2002年
2003年
2004年
2005年
2006年
2007年
2008年
2009年
2010年
2011年
2012年
2013年
2014年
2015年
2016年
2017年
2018年
2019年
2020年
2021年
2022年
2023年
2024年
2025年
2026年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: