ubuntu使用gcc的问题

x505471821 2018-08-13 04:09:32
我是在ubuntu64位系统下编译链接普通C程序,为什么默认生成的不是可执行文件,而是共享目标文件。如图
...全文
347 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
x505471821 2018-08-20
  • 打赏
  • 举报
回复
引用 14 楼 qiuxin315 的回复:
[quote=引用 楼主 x505471821 的回复:]
我是在ubuntu64位系统下编译链接普通C程序,为什么默认生成的不是可执行文件,而是共享目标文件。如图


楼主查询一下Linux下的PIE相关的资料。

PIE:位置独立的可执行区域(position-independent executables)
用来创建介于共享库和通常可执行代码之间的代码,能像共享库一样可重分配地址的程序
有 -fpie, -fPIE, -pie三个参数
-fpie与-fPIE,用于编译(作用一样,强度不同)
-pie 用于链接
要生成PIE程序,需要两者配合使用,即使用-fpie -pie或-fPIE -pie



gcc -o test test.c // 默认情况下,不开启PIE
gcc -fpie -pie -o test test.c // 开启PIE,此时强度为1
gcc -fPIE -pie -o test test.c // 开启PIE,此时为最高强度2
gcc -fpic -o test test.c // 开启PIC,此时强度为1,不会开启PIE
gcc -fPIC -o test test.c // 开启PIC,此时为最高强度2,不会开启PIE


没有Ubuntu环境,无法测试,gcc默认应该是不开启PIE的,不知道你的为什么默认开启了,要不你贴出代码看看。[/quote]
嗯,你的分析是正确的,新的Ubuntu64位,GCC默认开启了pie,现在已经解决了
destory27 2018-08-17
  • 打赏
  • 举报
回复
引用 2 楼 x505471821 的回复:
[quote=引用 1 楼 sghcpt 的回复:]
[quote=引用 楼主 x505471821 的回复:]
我是在ubuntu64位系统下编译链接普通C程序,为什么默认生成的不是可执行文件,而是共享目标文件。如图

楼主,生成的t文件不是已经成功了吗?t就是执行文件吧。。。你试试 ./t 运行一下,看看有没有结果输出。。。[/quote]

执行没有问题,但是我现在想让gcc编译链接后生成类型为executable的可执行文件[/quote]
linux下不以文件后缀名区分文件,不会像windows下生成.exe ,linux下文件权限有X就可以执行,如果要像Windows那样,你可以写成 -o t.exe。
不知是不是这个意思。。。。。
x505471821 2018-08-17
  • 打赏
  • 举报
回复
哎,一群连ELF基本类型都不知道的大神
x505471821 2018-08-17
  • 打赏
  • 举报
回复
引用 9 楼 shihengzhen101 的回复:
-o 后面就是最终生成的名字,如果想看文件类型,使用file命令,例如 file t
显示t: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

你这个明显就是executable类型的,你看我截图那个是shared object
qiuxin315 2018-08-17
  • 打赏
  • 举报
回复
引用 楼主 x505471821 的回复:
我是在ubuntu64位系统下编译链接普通C程序,为什么默认生成的不是可执行文件,而是共享目标文件。如图


楼主查询一下Linux下的PIE相关的资料。

PIE:位置独立的可执行区域(position-independent executables)
用来创建介于共享库和通常可执行代码之间的代码,能像共享库一样可重分配地址的程序
有 -fpie, -fPIE, -pie三个参数
-fpie与-fPIE,用于编译(作用一样,强度不同)
-pie 用于链接
要生成PIE程序,需要两者配合使用,即使用-fpie -pie或-fPIE -pie



gcc -o test test.c // 默认情况下,不开启PIE
gcc -fpie -pie -o test test.c // 开启PIE,此时强度为1
gcc -fPIE -pie -o test test.c // 开启PIE,此时为最高强度2
gcc -fpic -o test test.c // 开启PIC,此时强度为1,不会开启PIE
gcc -fPIC -o test test.c // 开启PIC,此时为最高强度2,不会开启PIE


没有Ubuntu环境,无法测试,gcc默认应该是不开启PIE的,不知道你的为什么默认开启了,要不你贴出代码看看。
huofire001 2018-08-16
  • 打赏
  • 举报
回复
elf文件就是Executable and Linkable Format的简写,“e”就是excutable(可执行)的简写,不知楼主是不是因为没看到executable这个词而有此一问。
AlbertS 2018-08-16
  • 打赏
  • 举报
回复
-o 后面就是最终生成的名字,如果想看文件类型,使用file命令,例如 file t
显示t: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
赵4老师 2018-08-14
  • 打赏
  • 举报
回复
没扩展名不习惯是吧。
假正经的班长 2018-08-14
  • 打赏
  • 举报
回复
t 就是这个“类型为executable的可执行文件”
x505471821 2018-08-14
  • 打赏
  • 举报
回复

zilaishuichina 2018-08-14
  • 打赏
  • 举报
回复
gcc t.c -o t.exe

估计lz是想要这样。。。。
x505471821 2018-08-13
  • 打赏
  • 举报
回复
引用 1 楼 sghcpt 的回复:
[quote=引用 楼主 x505471821 的回复:]
我是在ubuntu64位系统下编译链接普通C程序,为什么默认生成的不是可执行文件,而是共享目标文件。如图

楼主,生成的t文件不是已经成功了吗?t就是执行文件吧。。。你试试 ./t 运行一下,看看有没有结果输出。。。[/quote]

执行没有问题,但是我现在想让gcc编译链接后生成类型为executable的可执行文件
sghcpt 2018-08-13
  • 打赏
  • 举报
回复
不明白楼主你说的是什么意思呀。。。既然执行没有问题,生成的t就是一个执行文件来的呀。。。
sghcpt 2018-08-13
  • 打赏
  • 举报
回复
引用 楼主 x505471821 的回复:
我是在ubuntu64位系统下编译链接普通C程序,为什么默认生成的不是可执行文件,而是共享目标文件。如图

楼主,生成的t文件不是已经成功了吗?t就是执行文件吧。。。你试试 ./t 运行一下,看看有没有结果输出。。。

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧