コグノスケ


link 未来から過去へ表示  link 過去から未来へ表示(*)

link もっと前
2021年10月11日 >>> 2021年10月11日
link もっと後

2021年10月11日

freestandingとnostdlib

目次: GCC

コンパイラオプションで-ffreestanding -nostdlibを指定したときと、-nostdlibだけを指定したときの挙動の違いをメモしておきます。

テストプログラム
int printf(const char *a, ...);

void _start(void)
{
        printf("\n");
}

おそらくこの例がわかりやすいと思います。-ffreestanding -nostdlibの場合は「freestanding環境」をしてします。C言語の規格ではhostedとfreestandingの2つが定められていて、hostedは全ての標準ライブラリ関数が使える環境、freestandingは標準Cライブラリが存在しない環境(※)を意味します。OSのない環境などを想定しています。

このときprintf() は素直にprintf() 関数の呼び出しとしてコンパイルされます。したがって、

freestanding環境、nostdlibでのコンパイル、リンク結果
$ gcc -g -Wall -ffreestanding -nostdlib a.c

/usr/bin/ld: /tmp/ccclc296.o: in function `_start':
a.c:4: undefined reference to `printf'

リンクエラーも「printfがないよ」となります。これはnostdlibを指定しているので、暗黙のうちにリンクされる標準Cライブラリ(-lc)すらもリンクされないからです。

一方、ffreestandingを指定しない場合は、標準Cライブラリが存在するものとして最適化が働きます。この例で言えば、printf("\n"); はputchar('\n') に置き換えた方が良いね!という最適化が働きます。したがって、

hosted環境、nostdlibでのコンパイル、リンク結果
$ gcc -g -Wall -nostdlib a.c

/usr/bin/ld: /tmp/ccZ5E2Qq.o: in function `_start':
a.c:4: undefined reference to `putchar'

リンクエラーは「putcharがないよ」となります。

(※)標準ヘッダのうちfloat.h, iso646.h, limits.h, stdarg.h, stdbool.h, stddef.hのみ使えます。
正確な意味が知りたければ、C99 draft TC3 (N1256) 4.Conformanceの6. を参照ください。

どちらを使うか

どちらが良いとかではなくて、作りたいシステム次第です。

標準Cライブラリを使わず、CライブラリのAPIを前提とした最適化をされると困るなら、-ffreestandingを指定しなければなりません。コンパイラが抱えているCライブラリの代わりに、あえて別の標準Cライブラリ準拠のライブラリを使う(つまりfreestandingではない)ときは、-ffreestandingは使わず -nostdlibだけの方が実行速度などで有利だと思われます。

編集者:すずき(2023/09/24 11:44)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2021年10月11日 >>> 2021年10月11日
link もっと後

管理用メニュー

link 記事を新規作成

<2021>
<<<10>>>
-----12
3456789
10111213141516
17181920212223
24252627282930
31------

最近のコメント5件

  • link 24年6月17日
    すずきさん (06/05 23:32)
    「Thnaks for your info...」
  • link 24年6月17日
    Bobさん (06/04 09:25)
    「BindIPv6Only=no does...」
  • link 18年8月12日
    すずきさん (05/29 16:57)
    「コメントありがとうございます。\n\nこ...」
  • link 18年8月12日
    ARM926EJ-Sさん (05/29 14:27)
    「この記事が書かれたのは2018年ですが、...」
  • link 17年9月3日
    すずきさん (05/26 23:59)
    「>ちょさんさん\nご参考になれば幸いです...」

最近の記事3件

  • link 21年12月28日
    すずき (06/22 23:33)
    「[ゲーム - まとめリンク] 目次: ゲーム一覧が欲しくなったので作りました。Wizardry(囚われし亡霊の街)敵が強すぎる...」
  • link 25年6月19日
    すずき (06/22 23:33)
    「[歴代据え置きハードのCPUとGPU] 目次: ゲーム最近、据え置きハードのCPUとGPUがNVIDIAとAMDに収束していま...」
  • link 25年6月18日
    すずき (06/22 23:33)
    「[Nintendo Switch 2当選] 目次: ゲームSwitch 2の抽選4回目で当選してました。わーい。今回も落選だっ...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 2025年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www2.katsuster.net
RDFファイル RSS 1.0

最終更新: 06/22 23:33