我正在构建一个共享库,它具有各自的代码和编译规则,如下所示:
// x.C
struct {
short len;
char s[32700];
} foo;
// u.C
extern struct {
short len;
char s[32700];
} foo;
void blah(void)
{
foo.s[0] = 0 ;
}
$CXX -c x.C -fPIC
$CXX -c u.C -fPIC
$CXX -shared -o x.so.1 -Wl,-soname,x.so.1 x.o u.o
Run Code Online (Sandbox Code Playgroud)
此代码使用 intel (v13-v16) 编译器和 clang 编译器 (v3.6) 进行编译和链接,但使用 g++(版本 4.9.2)时出现链接错误:
u.o: relocation R_X86_64_PC32 against undefined symbol `foo' can not be used when making a shared object; recompile with -fPIC
Run Code Online (Sandbox Code Playgroud)
这里关于 -fPIC 的链接错误显然是错误的,因为代码是用 fPIC 编译的。我还在输出中看到符号的重定位记录objdump …