• 13
  • 12月

这几天,有个同事问在GCC中,怎么给一段汇编的程序指令地址。

我就说先用.section定义一个段名,然后再在ld中进行定位。

结果,定义了一个段名后,dump出来的汇编程序中使用没有这段。

然后,才想起来,定义完段名后,还要定义段的属性。

.section test_sec, "ax"

主要就是为了告诉连接器这是一个需要分配空间的可执行的段。

特此记录,以免下一次忘记。

  • 3
  • 11月

最近使用GCC时,老是提示一个错误:
/cygdrive/xx/..\xxx/xxxx.c:118: multiple definition of `xxxx'<br />
xxx/xxxx.o:/cygdrive/xx/..\xxx/xxxx.c:118: first defined here


大概意思就是,有一个函数重定义了!
可是在整个程序中,我并没有去重定义这个函数啊!

最后,经过Hanny的一番查找,原来是斜杆和反斜杆惹的祸!

我们知道,Windows是比较喜欢用反斜杆的,而Linux却钟情于斜杆。

由于在GCC的Makefile中使用了反斜杆的路径,而在linker文件中却使用了斜杆路径,这样,链接器就认为是两个不同路径了。同一个文件也就链接了两次,造成了重定义的发生。

解决方法就是,统一使用斜杆或反斜杆就行了。而Hanny比较推荐斜杆。

  • 26
  • 11月

这几天一直被一个叫Global Offset Table的东西困扰着。

在uboot的程序上看到一个叫_GLOBAL_OFFSET_TABLE_的东东,却到处找不到。经过一番Google,才明白这东东叫全局变量偏移表,用来做与位置无关的程序编译时使用的。并且编译选项要加上-mabicalls。另:与程序位置无关的编译选项是:-fpic和-fPIC。

Global Offset Table里,存得是一些函数地址,放在.got段。一般是使用gp来访问。

不过在资料中还看到,这个主要用于一些动态库。如果没用到动态库的话,应该也不是十分太需要吧,毕竟使用GOT会影响small data的使用,同时会增加每个函数调用所需的指令。