gcc 非静态链接产生段错误

ga6840 2012-06-22 02:36:49
我虚拟机里的Linux是自己DIY的,为了在里面编译一个Hello world,我把一个已经装有gcc的系统里的gcc命令、库 复制(主要复制了/usr/include 和 usr/lib 里面的文件)到虚拟机里的相应目录(我从复制gcc和ld程序开始,利用ldd和提示 把依赖的库一点一点复制到虚拟机里)直到可以利用gcc正常编译Hello world。
但是发现在虚拟机里利用
 gcc main.c 

编译出来的程序会产生Segmentation fault:

但是静态链接hello world可以正常运行:
 gcc -static main.c 


另外,执行:
 ld -nostdlib -o hello -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o main.o -L /usr/lib/ -lc /usr/lib/crtn.o 

可以在装有gcc的系统里面生成可运行的程序,但在DIY的Linux里则会提示类似以下的错误:
。。。
/lib//libc.a(fseek.o): In function `fseek':
(.text+0xde): undefined reference to `_Unwind_Resume'
/lib//libc.a(fseek.o):(.eh_frame+0xdf): undefined reference to `__gcc_personality_v0'
/lib//libc.a(ftello.o): In function `ftello':
(.text+0x194): undefined reference to `_Unwind_Resume'
/lib//libc.a(ftello.o):(.eh_frame+0xdf): undefined reference to `__gcc_personality_v0'
。。。

请问为什么这种情况下 gcc 非静态链接产生段错误,还有以上的错误能不能看出需要再链接什么库?
...全文
204 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xunxun 2012-06-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

再请问一下xunxun1982, 你是怎么知道缺少-lgcc_eh的?
[/Quote]
弄得多了,自然就知道
如果弄过gcc源代码就知道Unwind_Resume和异常有关,想想就知道了

当然有个普遍方法

到他lib搜索路径相关的位置nm看lib的符号

看哪个里面有T开头的就是内部引用实现,即是你需要链接的库
ga6840 2012-06-22
  • 打赏
  • 举报
回复
再请问一下xunxun1982, 你是怎么知道缺少-lgcc_eh的?
ga6840 2012-06-22
  • 打赏
  • 举报
回复
嗯,我没有刷新,所以没有看到,谢谢了
ga6840 2012-06-22
  • 打赏
  • 举报
回复
谢谢xunxun1982,那么静态链接为什么就可以呢?
xunxun 2012-06-22
  • 打赏
  • 举报
回复
不用-static为动态链接,只要ABI不同,便会段错误。
静态库都把原来相同版本的代码集中在一起了,当然就没问题了……
xunxun 2012-06-22
  • 打赏
  • 举报
回复
原来说过了,不同的Linux的库有可能不兼容(版本,关键是API和ABI)

后面那个链接错误是缺少异常库,即-lgcc_eh,但是异常库不同版本的ABI极容易发生更改,更别说还有sjlj/dw2异常之分了

18,784

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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