当前位置: 首页 > article >正文

gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?

gcc 1.c和g++ 1.c编译阶段有什么区别?

借用 gcc 1.c和g++ 1.c有什么区别? 的示例代码,以汇编代码为比较目标,再经过汇编,最后生成ELF文件,三个过程结果均无差异,这个阶段充分证明了c和c++是多么相似。

编译到汇编

  • gcc -S 1.c -o 1.s
  • g++ -S 1.c -o 11.s
	.file	"1.c"
	.text
	.section	.rodata
.LC0:
	.string	"%d"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$16, %rsp
	movw	$100, -2(%rbp)
	movswl	-2(%rbp), %eax
	movl	%eax, %esi
	leaq	.LC0(%rip), %rax
	movq	%rax, %rdi
	movl	$0, %eax
	call	printf@PLT
	movl	$1, %eax
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0"
	.section	.note.GNU-stack,"",@progbits
	.section	.note.gnu.property,"a"
	.align 8
	.long	1f - 0f
	.long	4f - 1f
	.long	5
0:
	.string	"GNU"
1:
	.align 8
	.long	0xc0000002
	.long	3f - 2f
2:
	.long	0x3
3:
	.align 8
4:

汇编:

  • gcc -c 1.s -o 1.o
  • g++ -c 11.s -o 11.o

链接

  • gcc 1.o -o 1
  • g++ 11.o -o 11

如何知道g++编译默认会定义_GNU_SOURCE?

可以通过g++ --verbose选项查看g++定义了哪些宏。

gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
COLLECT_GCC_OPTIONS='-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'a-'
/usr/lib/gcc/x86_64-linux-gnu/11/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE 1.c -quiet -dumpdir a- -dumpbase 1.c -dumpbase-ext .c -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccVq1vV1.s


若文章对您有帮助,欢迎关注。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。


http://www.kler.cn/a/395073.html

相关文章:

  • Mysql篇-三大日志
  • linux上海康SDK安装并设置环境变量
  • 探索 HTML 和 CSS 实现的蜡烛火焰
  • react + ts定义接口类型写法
  • 微服务即时通讯系统的实现(客户端)----(1)
  • 代码随想录第二十一天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
  • Mysql篇-三大日志
  • Linux设置Nginx开机启动
  • http拉取git仓库,每次都要输入帐号密码,Ubuntu上记住帐号密码
  • 微积分复习笔记 Calculus Volume 1 - 5.5 Substitution
  • sqlserver 常用分页函数
  • ssh key的生成密钥
  • 区间数位和模板(贪心)
  • ROS Action
  • SQL 注入详解:原理、危害与防范措施
  • Oracle 11g rac 集群节点的修复过程
  • 通过脚本,发起分支合并请求和打tag
  • 【贪心算法】贪心算法三
  • 【HAProxy07】企业级反向代理HAProxy高级功能之Cookie 会话保持与HAProxy 状态页
  • 计算机网络——路由选择算法
  • 校园二手交易网站毕业设计基于SpringBootSSM框架
  • Invar-RAG:基于不变性对齐的LLM检索方法提升生成质量
  • 初识Linux · 信号产生
  • 通过Python 调整Excel行高、列宽
  • 技术栈1:nginx基础入门
  • 计算机网络——1.1计算机网络概述