私の質問:
- 関数ポインタの等価性はC標準で保証されていますか?
- (1)の答えが「はい」の場合。異なる最終コンパイル ユニット (メインの実行可能ファイルと共有ライブラリなど) で取得されるポインターに関係なく、これは当てはまりますか?
- 動的ローダーはそれをどのように処理しますか? (これが難しい理由はいくつか考えられますが、すべて PIC コードに関連しています (たとえば、elf の GOT テーブルや、それに相当する COFF が使用するもの))。(1) と (2) に関係なく、Linux ローダーはこれを保証しているようです。
ここに例があります。上記の質問は、C が何main.c
を出力 するかを保証するかどうか、"Function equality: 1"
または"Function equality: 0"
最初のケースでは、動的ローダーがそれをどのように実現するかということになります。
common.h:
extern void * getc_main;
extern void * getc_shared;
void assign_getc_shared();
main.c:
#include <stdio.h>
#include "common.h"
int main()
{
getc_main = (void*) getc;
assign_getc_shared();
printf("Function equality: %d\n", getc_main == getc_shared);
return 0;
}
shared.c:
#include <stdio.h>
#include "common.h"
void assign_getc_shared()
{
getc_shared = (void*) getc;
}
Unix では、これは次のコマンドでコンパイルされます。
cc -shared -fPIC -o libshared.so shared.c
cc -o main main.c -L. -lshared
そして、以下で実行:
LD_LIBRARY_PATH=. ./main