У меня есть проект 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
Спасибо за ответ @Gwen. ld терпит неудачу с указанной вами линией. error: непризнанная опция '-z'. Я проверил ld.exe --help, и он не включает флаг z и ничего не связано с noexecstack, relro или теперь, что так всегда. – quinz
В документации [ld] (https://sourceware.org/binutils/docs/ld/Options.html) упоминается эта опция для v 2.26. Какая у вас версия gcc? Редактировать: У меня его нет в ld 2.25. – Gwen
Спасибо, мне кажется, что мой ld - версия 2.24. Позвольте мне попробовать обновить его и посмотреть, работает ли это. Также обновлен вопрос с информацией о версии. – quinz