0

シンボルテーブルには、シンボル名のオフセットのみがあり、シンボルが属するlibに関する情報はありません。

    typedef struct {
        Elf32_Word st_name;
        Elf32_Addr st_value;
        Elf32_Word st_size;
        unsigned char st_info; / *バインド、タイプ:ELF_32_ST _... * /
        unsigned char st_other;
        Elf32_Half st_shndx; / * SHN _... * /
    } Elf32_Sym;

実行時に解決関数が呼び出されると、シンボルテーブルのオフセットと別のDWORDが渡されます。そのDWORDはシンボルのlibと関係がありますか?そうでない場合、解決関数はどのようにしてシンボルのライブラリを見つけますか?

4

1 に答える 1

1

解決関数はどのようにしてシンボルのlibを見つけますか

プロセスにロードされたライブラリ(ローダーが維持する)の線形検索による。

指定された関数を定義する最初のライブラリが「勝ち」ます。これにより、たとえば、などlibtcmalloc.soを定義mallocし、callocこれらのシンボルをオーバーライドできます(を使用するか、前にLD_PRELOADリンクするため、前にローダーリストに表示されます)。libtcmalloclibclibtcmalloclibc

検索はライブラリの数に比例しますが、各ライブラリにはそのシンボルのハッシュテーブル(またはセクションO(1)内)があるため、各ライブラリ内で検索されます。.hash.gnu_hash

于 2013-03-04T01:55:41.590 に答える