質問をするインターフェースは、多くの「あなたの答えがすでにあるかもしれない質問」にフラグを立てていますが、私がここにいることを正確に尋ねている質問があるかどうかを確認するためにデューデリジェンスを試みました. これが重複している場合は申し訳ありません。
次の間違ったプログラムがあるとします。
extern void undefined_function(void); int main(int argc, char **argv) { undefined_function(); undeclared_function(); 終了 (0); }
gcc でコンパイルすると、次のようになります。
$ gcc warnings.c warnings.c: 関数 'main' 内: warnings.c:6:2: 警告: 組み込み関数 'exit' の互換性のない暗黙の宣言 [デフォルトで有効] /tmp/ccVzjkvX.o: 関数「main」内: warnings.c:(.text+0x15): 「undefined_function」への未定義参照 warnings.c:(.text+0x1f): 「undeclared_function」への未定義の参照 collect2: ld が 1 つの終了ステータスを返しました $
これらの警告が表示される理由と、それらを修正する方法は知っています。それは私の質問ではありません。
出力から、gcc が他の未定義/宣言されていない関数とは異なる方法で処理していることは明らかです。これは、exit()
それを「組み込み関数」と見なしているためです。
特定の gcc について、gcc が「組み込み関数」と見なす関数のリストをどのように確認できますか? それはまさにC標準ライブラリ関数のリストですか、それとも何か他のものですか?
を検討しnm libc.so
ましたが、Ubuntu VM では、この glibc が取り除かれているように見えるため、この点に関して有用な情報はありません。
$ nm /lib/x86_64-linux-gnu/libc.so.6 nm: /lib/x86_64-linux-gnu/libc.so.6: シンボルなし $