2016-03-22 2 views
0

У меня есть проект Qt, который я компилирую с помощью GCC и MinGW для Ubuntu и Windows.LDFLAGS в файле Qt pro

I got a requirement to harden it by adding the following LDFLAGS:

  • Stack execution protection: LDFLAGS="-z noexecstack"
  • Data relocation and protection (RELRO): LDLFAGS="-z relro -z now"

Вопрос в том, может быть это сделано с .pro-файлом и как? Мне было легко добавить LFLAGS и CFLAGS в файл проекта, но ничего не нашел для LDFLAGS. Даже выходные файлы Makefile не имеют определенных LDFLAGS.

Один из способов, который я нашел после долгих поисковых запросов, заключался в том, чтобы добавить QMAKE_CFLAGS_RELEASE += "--noexecstack" в файл .pro, но я не уверен, что это правильный путь.

После предыдущей строки, сгенерированный Makefile выглядит следующим образом:

CC   = gcc 
CXX   = g++ 
DEFINES  = -DUNICODE -DMY_LIBRARY -DQT_NO_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB 
CFLAGS  = -pipe -fno-keep-inline-dllexport -O2 -fstack-protector-strong -O2 -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security --noexecstack -Wall -Wextra $(DEFINES) 
CXXFLAGS  = -pipe -fno-keep-inline-dllexport -O2 -frtti -Wall -Wextra -fexceptions -mthreads $(DEFINES) 
LINKER  = g++ 
LFLAGS  = -Wl,-s -shared -Wl,-subsystem,windows -mthreads -Wl,--out-implib,C:\libmylib0.a 

noexecstack появляется в CLFAGS списке, но не уверен, что это хорошо. CFLAGS - это не то же самое, что и LDFLAGS. Кажется, это не подтвердило команду либо с --thisdoesntexist, похоже, прошло, когда я попытался.

Заранее спасибо.

EDIT:

На основании ответа Гвен я попытался добавить QMAKE_LFLAGS += "-z noexecstack -z relro -z now", но это произвело ошибку из ld.exe: error: unrecognized option '-z'

edit2:

версии инструмента:

C:\Qt\Qt5.5.0\Tools\mingw492_32\bin>ld.exe -v 
GNU ld (GNU Binutils) 2.24 

C:\Qt\Qt5.5.0\Tools\mingw492_32\bin>g++.exe --version 
g++.exe (i686-posix-dwarf-rev1, Built by MinGW-W64 project) 4.9.2 

ответ

1

С моей конфигурацией (QtCreator + Visual C++ компилятор), то LFLAGS, определенный в Makefile дается линкер, вопреки тому, что сказано в GNU make documentation:

LDFLAGS : Extra flags to give to compilers when they are supposed to invoke the linker[...] LFLAGS : Extra flags to give to Lex.

Я думаю, вы должны попробовать добавить QMAKE_LFLAGS += "-z noexecstack -z relro -z now" к вашему. pro file, пуст вашу папку сборки, запустите qmake и посмотрите, предоставлена ​​ли опция компоновщику.

+0

Спасибо за ответ @Gwen. ld терпит неудачу с указанной вами линией. error: непризнанная опция '-z'. Я проверил ld.exe --help, и он не включает флаг z и ничего не связано с noexecstack, relro или теперь, что так всегда. – quinz

+0

В документации [ld] (https://sourceware.org/binutils/docs/ld/Options.html) упоминается эта опция для v 2.26. Какая у вас версия gcc? Редактировать: У меня его нет в ld 2.25. – Gwen

+0

Спасибо, мне кажется, что мой ld - версия 2.24. Позвольте мне попробовать обновить его и посмотреть, работает ли это. Также обновлен вопрос с информацией о версии. – quinz