を-S。与えられたC関数foo
はアセンブラに_foo
と表示されます。これは手で生成されたファイル.s
との衝突を避けるために行われました。
合計8文字に制限されます(リンカー制限)。
これは何十年も真実ではありません。今や、記号の先頭には_
がなくなり、8文字をはるかに超えることがあります。
UPDATE:
だから、今日ではGCCは関数や変数の前に_を生成しないのですか?
ほとんどの場合、この時点であなたが引用している参考資料であるIMOは、少し古いと思われます。
ほとんどのPOSIXシステム(linux、* BSDなど)はgcc
[またはclang
]を使用し、_
をそのまま使用します。
C [1981年]でプログラミングを始めたとき、まだ_
が使用されていました。これはAT & T Unix v7、System III、およびSystem V.
IIRCであり、新しいシステム(Linuxなど)では1990年代初頭に廃止されました。個人的には、それ以来_
という接頭辞がありませんでしたが、linux [と時にはcygwin]を使用しました。
いくつかのAT & T Unixから派生したシステムは、下位互換性のために残しているかもしれませんが、最終的には、 "foo is foo"で標準化されたほとんどの人がいます。私はOSXにアクセスできないので、それに関するJohnathanのコメントを除外することはできません。
_
は、UNIX(1970年頃)の初期から周りを回っていました。これは私の時間の前であったが、IIRC、Unixはもともとアセンブラで書かれていた。それはCに変換されました。_
は、C言語で書かれた関数、またはC言語関数から呼び出せる関数を定義することでした。
接頭辞を持たないものは[asmのみ] [非標準呼び出し規約を使用している可能性があります]でした。 RAM、CPUサイクルなど
したがって、asm関数はリソースを節約するために "トリック"を使うことができます。いくつかのasm関数は、お互いを知っていたのでグループとして機能することができました。
Cから特定のasm関数を呼び出すことができた場合、_
というプレフィックス記号はCの「ラッパー」となっていました[prolog/epilogで余分なセーブ/リストアを行った]。
私はCプログラムのmain関数を "call_main"の代わりに "call main"と呼ぶことができますか?
これは合理的に安全な賭けです。
Cから特定の関数を呼び出す場合、自動的に正しいことが行われます(接頭辞を追加するかどうかなど)。
問題がかもしれないという手作りのアセンブラからC関数を呼び出そうとしているときだけです。
したがって、asmの場合、私は単純なことをしてcall main
を実行します。ほとんどの[すべてではないにしても]システム上で動作します。あなたは「証拠弾丸は」あなたのコードは、あなたが(.S
ファイルを経由して)Cプリプロセッサを通して、あなたのASMを実行して行うことができますしたい場合
(例):
#ifdef C_USES_UNDERSCORE
#define CF(_x) _##_x
#else
#define CF(_x) _x
#endif
call CF(main)
はしかし、私はそれがだと思います過剰な
また、_
という接頭辞の問題の全体を示しています。現代のシステム(メモリとCPUサイクルがたくさんある)では、アセンブラ関数は、呼び出し元のABI互換関数がCか手書きアセンブラから生成されたものかどうかを知る必要がありますか?
にあなたはユーザー空間のプログラムをコンパイル。どのように "カーネル"タグがその問題に関連していますか? – Tsyvarev
最近のツール/ソフトウェアの最新のリソースを使用 – Olaf