我有一个Qt项目,我正在为GCC和MinGW编译Ubuntu和Windows。Qt pro文件中的LDFLAGS
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的任何内容。即使输出Makefiles似乎也没有定义任何LDFLAGS。
长时间搜索后发现的一种方法是在.pro文件中添加QMAKE_CFLAGS_RELEASE += "--noexecstack"
,但我不相信这是正确的方法。
线之上后,生成的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
似乎也经历了,当我尝试。
预先感谢您。
编辑:
基于Gwen的答案,我尝试添加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不符合你提到的那一行。错误:无法识别的选项'-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