У меня есть проект Qt, который я компилирую с GCC и MinGW для Ubuntu и Windows.
Я получил требование укрепить его, добавив следующие LDFLAGS:
- Защита исполнения стека:
LDFLAGS="-z noexecstack"
- Перемещение и защита данных (RELRO):
LDLFAGS="-z relro -z now"
Вопрос в том, можно ли это сделать с помощью файла .pro и как? Мне было легко добавить LFLAGS и CFLAGS в файл проекта, но я не смог найти ничего для LDFLAGS. Кажется, даже выходные файлы Makefile не имеют каких-либо определенных LDFLAGS.
Один способ, который я нашел после долгого поиска в Google, был добавить 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
казалось, прошел также, когда я пытался.
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Основываясь на ответе Гвен, я попытался добавить 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
В моей конфигурации (компилятор QtCreator + Visual C ++) LFLAGS, определенные в make-файле, передаются компоновщику, в отличие от того, что указано в GNU делает документацию:
LDFLAGS
: Дополнительные флаги для компиляторов, когда они должны вызывать компоновщик […] LFLAGS
: Дополнительные флаги для Лекса.
Я думаю, вы должны попробовать добавить QMAKE_LFLAGS += "-z noexecstack -z relro -z now"
в файл .pro, очистите папку сборки, перезапустите qmake и посмотрите, передана ли эта опция компоновщику.
Других решений пока нет …