LINUX.ORG.RU

cmake, -fPIC


0

0

Есть проет на cmake, при сборке cmake добавляет опцию -fPIC. Что эта за вещь, откуда она берется и как ее проконтролировать? Типа cmake находит в коде asm для PIC контроллеров что ли?

требуется для shared библиотек, особенно на x86_64
все правильно добавляет, читайте man gcc

Sylvia ★★★★★
()

man gcc
/fPIC

Как контролировать - хз.

staseg ★★★★★
()
Ответ на: комментарий от placement_new

платформа 32 бита?

-fno-pic можно в CFLAGS и CXXFLAGS добавить или -mauto-pic

вообще ассемблерные вставки таких проблем вызывать не должны, пишите багрепорт авторам кода

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

вообще ассемблерные вставки таких проблем вызывать не должны, пишите багрепорт авторам кода

Ох уж эти халявщики... Никто вам ничего не должен.

mv ★★★★★
()
Ответ на: комментарий от mv

так я правильно понимаю, что на платформе поддерживающей PIC библиотека насильно скомпилированная с -fno-pic может грохнуться?

placement_new ★★
() автор топика
Ответ на: комментарий от linuxfan

в целом -fPIC должен автоматически использоваться GCC для x86_64, но иногда он этого не делает, пример:


evy ^_^ sylvia /tmp/zlib-1.2.5 >export CC=gcc
evy ^_^ sylvia /tmp/zlib-1.2.5 >export CFLAGS=-O2
evy ^_^ sylvia /tmp/zlib-1.2.5 >./configure --enable-shared
...
gcc -O2 -fPIC -D_LARGEFILE64_SOURCE=1 -DPIC -c -o objs/zutil.o zutil.c
gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map -O2 -fPIC -D_LARGEFILE64_SOURCE=1 -o libz.so.1.2.5 adler32.lo compress.lo crc32.lo deflate.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo uncompr.lo zutil.lo -lc -L. libz.a


fPIC DPIC были подставлены configure, а теперь отдадим флаги на суд gcc, убираю -fPIC из Makefile

та та..

ld: adler32.lo: relocation R_X86_64_32 against `.text' can not be used when making a shared object; recompile with -fPIC
adler32.lo: could not read symbols: Bad value
collect2: ld returned 1 exit status


Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

в целом -fPIC должен автоматически использоваться GCC для x86_64, но иногда он этого не делает, пример:

та та..

ld: adler32.lo: relocation R_X86_64_32 against `.text' can not be used when making a shared object; recompile with -fPIC

Теперь осталось понять, почему использовать 32-битные иммедиэйты в библиотеке для 64-битной системы нельзя (вернее, не всегда возможно, и gcc об этом ничего знать не может и не должен), а для статически определимого бинарника - можно. И даже нужно.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.