2016-03-22 108 views
0

我有一个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列表中,但不知道这是正常的。 CFLAGSLDFLAGS不一样。它似乎并没有验证命令,因为--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 

回答

1

随着我的配置(QtCreator +的Visual C++编译器),在Makefile中定义的LFLAGS被传给连接器,相反的是在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文件,清空你的构建文件夹,重新运行qmake,并查看是否给链接器选项。

+0

感谢您的回复@Gwen。 ld不符合你提到的那一行。错误:无法识别的选项'-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