5

以下は非常に単純な C++ プログラムです。

// main.cpp
int main() {}

MyMakefileは、プログラムをコンパイルするために次のコマンドを生成します。

❯ make
g++ -O0 -fverbose-asm  -o main main.cpp

コマンドで確認してfile、ELF 実行可能ファイルであることを確認します。

❯ file main
main: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=921d352e49a0e4262aece7e72418290189520782, for GNU/Linux 3.2.0, not stripped

ELFヘッダーを調べようとするまで、すべて問題ないようです:

❯ readelf -e main
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
...
  Type:                              DYN (Shared object file)

ここのウィキペディアから、 などのさまざまな種類のファイルがあるようEXECです。単純なメイン プログラムが共有オブジェクトであり、ELF ヘッダーの実行可能ファイルではないと表示されるのはなぜですか?

私が持っている限られた知識の範囲から、.soそれらはリンクされているが実行時までロードされないライブラリであると思いました。この文脈でそれはどのように意味がありますか?

追加情報:

❯ g++ --version
g++ (Arch Linux 9.3.0-1) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.

❯ readelf --version
GNU readelf (GNU Binutils) 2.34
Copyright (C) 2020 Free Software Foundation, Inc.

❯ lsb_release -a
LSB Version:    1.4
Distributor ID: Arch
Description:    Arch Linux
Release:    rolling
Codename:   n/a
4

1 に答える 1