Подтвердить что ты не робот

Есть ли способ определить, что библиотека .a или .so была скомпилирована как независимый по позиции код?

Я получаю ошибку связывания при компиляции библиотеки numpy против lapack, указывающей, что мне нужно скомпоновать lapack с -fPIC. Я думал, что сделал именно это. Есть ли способ определить, что созданная библиотека lapack не зависит от позиции?

4b9b3361

Ответ 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