关于自己动手写编译器 链接器的相关问题, 烦请大牛解答一下小生的疑惑。

cqx5555 2017-12-10 10:43:39
问题如下: 1.程序的全局变量是如何在coff目标文件中存储的,尤其是char *a = "hello world!"?
2. 目标文件的重定位节的作用是啥? 他重定位的对象是啥?
3. 小生理解并实现了词法分析,语法分析, 现在卡在了语义分析的生成目标文件环节,内心还挺木乱的,还请大牛给点学习意见。
只有两百分了, 全贡献了。
...全文
215 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-12-12
  • 打赏
  • 举报
回复
楼主也可以直接研究gcc源代码。
自信男孩 2017-12-12
  • 打赏
  • 举报
回复
在能够熟练使用编程的编译器基础上再考虑去写。 如果不能把各种变量的存储位置,生命周期,使用规则等等了解清楚了,就去写编译器,链接器等等。就相当于地基没打好就去想着盖高楼。 我不是过来打击你的,而是告知我们应该遵循一个尝试和规律
Intel0011 2017-12-12
  • 打赏
  • 举报
回复
引用 5 楼 cqx5555 的回复:
[quote=引用 4 楼 zhao4zhong1 的回复:] 为什么不参考开源软件Tiny C Compiler呢?
那个挺简单的。 我看了, 不过似乎TINY C只能运行在TM虚拟机上, SC需要自己生成目标文件, 自己链接,运行在windows上, 所以还是有差距的。 总体SC比TINY C更难, 也更接近C语言[/quote] 不是这个,是法国大神的TCC,一个兼容C99的真正的C语言编译器 https://bellard.org/tcc/
cqx5555 2017-12-12
  • 打赏
  • 举报
回复
引用 6 楼 Intel0011 的回复:
[quote=引用 5 楼 cqx5555 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 为什么不参考开源软件Tiny C Compiler呢?
那个挺简单的。 我看了, 不过似乎TINY C只能运行在TM虚拟机上, SC需要自己生成目标文件, 自己链接,运行在windows上, 所以还是有差距的。 总体SC比TINY C更难, 也更接近C语言[/quote] 不是这个,是法国大神的TCC,一个兼容C99的真正的C语言编译器 https://bellard.org/tcc/[/quote] 嗯嗯。 谢谢提醒哈。 先把这个简单的实现了再看难的。 不着急。
cqx5555 2017-12-12
  • 打赏
  • 举报
回复
引用 7 楼 cfjtaishan 的回复:
在能够熟练使用编程的编译器基础上再考虑去写。 如果不能把各种变量的存储位置,生命周期,使用规则等等了解清楚了,就去写编译器,链接器等等。就相当于地基没打好就去想着盖高楼。 我不是过来打击你的,而是告知我们应该遵循一个尝试和规律
变量周期什么都能搞清楚。 可能就是在全局变量这块有点嘀咕。 这几天看了感觉还好。 不过还是感谢提醒
cqx5555 2017-12-11
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
为什么不参考开源软件Tiny C Compiler呢?
那个挺简单的。 我看了, 不过似乎TINY C只能运行在TM虚拟机上, SC需要自己生成目标文件, 自己链接,运行在windows上, 所以还是有差距的。 总体SC比TINY C更难, 也更接近C语言
赵4老师 2017-12-11
  • 打赏
  • 举报
回复
为什么不参考开源软件Tiny C Compiler呢?
cqx5555 2017-12-10
  • 打赏
  • 举报
回复
引用 2 楼 adlay 的回复:
1. 全局变量分两种, 已初始化的和未初始化的, 已初始化的全局变量保存在数据段中, 未初始化的全局变量在文件中不保存, 只记录加载到内存后的位置信息. char *a = "hello world!" 会首先在只读数据段中分配 "hello world!" 字符串的空间, 然后再分配指针变量 a 的空间, 并让 a 的初始值指向分配的字符串的地址. 2. 重定位用于动态链接库, 当两个动态库的加载位置冲突时, 只能有其中一个加载到预先设计好的位置, 另外一个加载的位置和保留的位置不同, 里面对全局变量的引用地址就会发生变化, 重定位表就用于在此时修正这些地址的变化. 3. 找一些开源的编译器代码来看吧
非常感谢哈, 我现在读的是自己动手写编译器链接器那本书里面的代码,还是有点木乱,我在读几天,如果还有不懂,到时候把代码发上来帮忙看看哈。 100分先预定给你了。
www_adintr_com 2017-12-10
  • 打赏
  • 举报
回复
1. 全局变量分两种, 已初始化的和未初始化的, 已初始化的全局变量保存在数据段中, 未初始化的全局变量在文件中不保存, 只记录加载到内存后的位置信息. char *a = "hello world!" 会首先在只读数据段中分配 "hello world!" 字符串的空间, 然后再分配指针变量 a 的空间, 并让 a 的初始值指向分配的字符串的地址. 2. 重定位用于动态链接库, 当两个动态库的加载位置冲突时, 只能有其中一个加载到预先设计好的位置, 另外一个加载的位置和保留的位置不同, 里面对全局变量的引用地址就会发生变化, 重定位表就用于在此时修正这些地址的变化. 3. 找一些开源的编译器代码来看吧
cqx5555 2017-12-10
  • 打赏
  • 举报
回复
自己顶一下。。。。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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