GNU/Linux >> Linux の 問題 >  >> Linux

Linux –すべてのCプログラムはライブラリをロードする必要がありますか?

のようなプログラムで
int main()
{
   return 0;
}
  • 静的にリンクすると、システム上の一部のライブラリが最終的なバイナリにリンクされます。
  • 動的にリンクすると、ライブラリは実行時に読み込まれますか?

本質的に、最も単純なプログラムでもライブラリは常に必要ですか?もしそうなら、なぜですか?実行したいものの正規のエントリポイントは実際には_start(ライブラリ、つまりglibcにあると思っていた)だと思ったので、私は尋ねます。設定に関して_startが実際に何をするのかわからないので、そこにあるポインタも役に立ちます。

承認された回答:

標準のポータブルCでプログラムを作成する場合は、もちろん、main()を呼び出すランタイムが必要です。 そもそも機能します。

ただし、それを気にしない場合は、ライブラリを省略して、インラインアセンブリを介して直接システムコールを実行できます。例えば。 x86-64の場合:

$ cat q.c
#include <sys/syscall.h>
void _start(void){
        __asm__( "syscall" : : "D"(0), "a"(SYS_exit) );
}
$ cc -O2 -static -nostdlib -nostartfiles -Wall q.c -o q
$ strace ./q
execve("./q", ["./q"], 0x7fffc72d8d20 /* 39 vars */) = 0
exit(0)                                 = ?
+++ exited with 0 +++

少なくとも1つのシステムコール、つまり_exit(2)を実行する必要があります 、「最も単純なプログラム」でクラッシュによる終了が受け入れられる場合を除き、その場合は空のファイルでも受け入れられます;-):

$ > foo.c
$ cc -static -nostdlib -nostartfiles -Wall foo.c -o ./foo
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000
$ ./foo
Segmentation fault

実行したいものの正規のエントリポイントは、実際には_startだと思いました。

それについて標準的なものは何もありません。 _start リンカが使用するデフォルトの名前です。 -e symを使用して他の場所にポイントすることができます オプション(-Wl,-e,sym gccを使用 。


Linux
  1. CでのLinuxソフトウェアライブラリを理解するためのガイド

  2. gdbを使用してLinuxでCプログラムをデバッグする方法

  3. LinuxにNcursesライブラリをインストールする方法

  1. Linuxにインストールされているすべてのパッケージを一覧表示する方法

  2. Linux で .so.1 ファイルが必要なのはなぜですか?

  3. Linux でのプログラムのアンインストール

  1. x86 Linux で MIPS アセンブリ プログラムを実行するにはどうすればよいですか?

  2. Linux で共有ライブラリを初期化する方法

  3. Linux 上の Swift で C ライブラリを使用する