免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2405 | 回复: 9
打印 上一主题 下一主题

[C] 链接的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-17 17:30 |只看该作者 |倒序浏览
本帖最后由 landker 于 2013-09-17 17:31 编辑

请问一下, .eh_frame,  .rel.eh_frame, .common,  .note.GNU-stack 这4个段是干什么用的?如果要进行链接,那如何进行?(即,.eh_frame是否是合并到.text中?)
  1. Section Headers:
  2.   [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  3.   [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  4.   [ 1] .text             PROGBITS        00000000 000034 000286 00  AX  0   0  4
  5.   [ 2] .rel.text         REL             00000000 000764 000090 08     10   1  4
  6.   [ 3] .data             PROGBITS        00000000 0002bc 000000 00  WA  0   0  4
  7.   [ 4] .bss              NOBITS          00000000 0002bc 000000 00  WA  0   0  4
  8.   [ 5] .comment          PROGBITS        00000000 0002bc 00002b 01  MS  0   0  1
  9.   [ 6] .note.GNU-stack   PROGBITS        00000000 0002e7 000000 00      0   0  1
  10.   [ 7] .eh_frame         PROGBITS        00000000 0002e8 000098 00   A  0   0  4
  11.   [ 8] .rel.eh_frame     REL             00000000 0007f4 000020 08     10   7  4
  12.   [ 9] .shstrtab         STRTAB          00000000 000380 000057 00      0   0  1
  13.   [10] .symtab           SYMTAB          00000000 0005b8 000140 10     11   8  4
  14.   [11] .strtab           STRTAB          00000000 0006f8 00006a 00      0   0  1

复制代码

论坛徽章:
0
2 [报告]
发表于 2013-09-17 17:33 |只看该作者
回复 1# landker

ding....
   

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
3 [报告]
发表于 2013-09-17 18:34 |只看该作者
回复 1# landker


.eh_frame用于异常处理(unwind information)段。
.rel.eh_frame中用于异常处理(unwind information)的重定位段。
.common 该段的符号都是常用的符号,如没有分配的C外部变量。
.note.GNU-stack该段用于指定stack上的代码是否可以具有可执性权限有CPU的NX相关。
另外.eh_frame不会合并到.text中



请参考:
http://linux.die.net/man/8/execstack
http://refspecs.linux-foundation ... ric/progheader.html
http://sourceware.org/ml/binutils/2003-05/msg00741.html
http://en.chys.info/2010/12/note-gnu-stack/

论坛徽章:
0
4 [报告]
发表于 2013-09-17 19:27 |只看该作者
本帖最后由 landker 于 2013-09-17 19:28 编辑
myworkstation 发表于 2013-09-17 18:34
回复 1# landker


那也就是说,如果要将几个*.o 链接到一起的话,一般只需要合并传统的(系统默认的)“.text”,“.data",”.bss“,”.rel.text“,”.strtab",“.shstrtab”,“.symtab”,“.rodata”段即可,是这样吗?

另,如果链接器是自己写的,如何进行调试?

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
5 [报告]
发表于 2013-09-17 21:30 |只看该作者
回复 4# landker


    不用纠结这个了,编译器甚至提供扩展让用户自定义段。段的数目不是固定不变的。不同的编译器生成的程序也可能有不同的段。

论坛徽章:
0
6 [报告]
发表于 2013-09-18 16:00 |只看该作者
回复 5# myworkstation


此外,请教一下,gld是否存在一种设置,可以限制(将要产生的ELF文件)ELF文件的段的组成?

即,对于将要生成的ELF文件,通过对gld的设置,只允许生成的ELF文件由“.text”,“.data",”.bss“,”.rel.text“,”.strtab",“.shstrtab”,“.symtab” 这几个段组成。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
7 [报告]
发表于 2013-09-18 16:06 |只看该作者
回复 6# landker


    不存在这样的选项,只有部分段是可以选择不生成的,而且每个这个的选择都是一个单独的选项。比如说--emit-relocs

论坛徽章:
0
8 [报告]
发表于 2013-09-18 16:12 |只看该作者
回复 6# landker


刚才写错了,应该是:

gcc 是否存在一种设置,可以限制(将要产生的 *.o文件)目标文件的段的组成?

即,对于将要生成的 *.o 文件,通过对gcc的设置,只允许生成的 *.o 文件由“.text”,“.data",”.bss“,”.rel.text“,”.strtab",“.shstrtab”,“.symtab” 这几个段组成。

论坛徽章:
0
9 [报告]
发表于 2013-09-18 18:15 |只看该作者
本帖最后由 landker 于 2013-09-18 20:53 编辑

回复 8# landker


还有,我写了一个非常简单的链接器,跟其他*.o链接生成了一个可执行文件(ELF格式),当运行它时,提示“已杀死”,运行环境:ubuntu

我想请教的是,有什么方法可以单步调试这个程序?

另,我知道 coredump 是可以获取一些有用的信息,但不知道是否适用于这里(似乎一般是“段错误”才采取这种方式)?不管怎样,我试了一下(网上提供的方法),如下:

1)ulimit -c unlimited

2)./t_elf      //可执行文件名

但上面的方式似乎并不奏效(我也是第一次进行这样的设置),因为并没有在当前目录下找到 coredump 文件 。是否我的设置有误?




论坛徽章:
0
10 [报告]
发表于 2013-09-20 10:55 |只看该作者
回复 9# landker

.......
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP