我的问题:
- 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