Я получаю ошибку связывания при компиляции библиотеки numpy против lapack, указывающей, что мне нужно скомпоновать lapack с -fPIC. Я думал, что сделал именно это. Есть ли способ определить, что созданная библиотека lapack не зависит от позиции?
Есть ли способ определить, что библиотека .a или .so была скомпилирована как независимый по позиции код?
Ответ 1
В общем, у вас нет способа узнать:
$ cat a.c
int foo(int x) { return x+1; }
$ gcc -fno-pic a.c -c -o nopic.o
$ gcc -fPIC a.c -c -o pic.o
$ cmp pic.o nopic.o
$ cmp pic.o nopic.o && echo Identical
Identical
Ответ 2
Возможно, вам повезло с этим ответом, хотя он зависит от платформы и не работает для всех объектных файлов (но если вы код каким-либо образом манипулирует указателями, он должен работать).
Это результат objdump -r
файла, скомпилированного с помощью -fPIC
:
test.o: file format elf32-i386
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
00000007 R_386_PC32 __i686.get_pc_thunk.cx
0000000d R_386_GOTPC _GLOBAL_OFFSET_TABLE_
и это файл без PIC:
test.o: file format elf32-i386