LINUX.ORG.RU

GCC делает PIC но я его не просил

 ,


1

2

Собираю код на bare metal, свою платку с cortex-m4f. После обновления на 6.x.x, перестал собираться. Решилось добавлением -static, но после тестов оказалось, что не работает.

Оказалось новые версии GCC создают секции .got и .got.plt которые я не забрал в финальный бинарь, не указал их в ld скрипте. Прочитав про них я понял, что это таблицы адресов для динамического связывания. Но я не включал -fPIC.

Вопрос зачем и как отключить?

CFLAGS	= -static -std=gnu99 -pipe
CFLAGS	+= -mcpu=cortex-m4 -mthumb
CFLAGS	+= -mhard-float -mfpu=fpv4-sp-d16
CFLAGS	+= -Wall -Wdouble-promotion
CFLAGS	+= -O3 -g3
CFLAGS	+= -fno-math-errno
CFLAGS	+= -ffinite-math-only
CFLAGS	+= -fno-signed-zeros
CFLAGS	+= -fno-trapping-math
CFLAGS	+= -fno-hosted
CFLAGS	+= -fno-stack-protector
CFLAGS  += -I.

LDFLAGS	= -nostdlib
LDFLAGS	+= -Wl,-T,hal/$(SCRIPT).ld

Все исходники доступны компилятору, бинарных либ нет.

★★
Ответ на: комментарий от xaizek

Да помогает, секции пропадают, но какой из четырех надо? И зачем он дефолтно включен?

-fpic -fPIC -fpie -fPIE

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

Можно попробовать глянуть, что включено:

echo | gcc -x c -v - -o /dev/null -Q

  • -fpic - для динамических библиотек с ограничением на размер таблиц
  • -fPIC - -fpic без ограничений
  • -fpie - для исполняемых файлов с ограничением на размер таблиц
  • -fPIE - -fpie без ограничений

И зачем он дефолтно включен?

Если платформа поддерживает, может решили включить по умолчанию для простоты. А может это не разработчики GCC, а те, кто его собирали, в spec-файл опции добавили.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)
Ответ на: комментарий от sf

Да есть --enable-default-pie. Понятно, спасибо.

amaora ★★
() автор топика

Теперь еще и с -flto не хочет собираться.

{standard input}: Assembler messages:
{standard input}:4273: Error: offset out of range
{standard input}:4303: Error: offset out of range
...

Как бы копнуть в чем там дело.

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

Перебрал исходники, нашел, что дело было в inline вставках в коде FreeRTOS. Исправил. Всем спасибо.

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