查看可执行文件,发现文件属性是shared library,而不是executable,导致这种情况的原因就是g++默认使用了-fpie参数。
什么是pie?
PIE(position-independent executable)是一种生成地址无关可执行程序的技术。如果编译器在生成可执行程序的过程中使用了PIE,那么当可执行程序被加载到内存中时其加载地址存在不可预知性。
PIE还有个孪生兄弟PIC(position-independent code)。其作用和PIE相同,都是使被编译后的程序能够随机的加载到某个内存地址。区别在于PIC是在生成动态链接库时使用(Linux中的so),PIE是在生成可执行文件时使用。
为了让链接生成的文件类型修改成executable,就需要添加编译选项 -no-pie