当前位置: 技术问答>linux和unix
gcc 非静态链接产生段错误
来源: 互联网 发布时间:2017-03-01
本文导语: 我虚拟机里的Linux是自己DIY的,为了在里面编译一个Hello world,我把一个已经装有gcc的系统里的gcc命令、库 复制(主要复制了/usr/include 和 usr/lib 里面的文件)到虚拟机里的相应目录(我从复制gcc和ld程序开始,利...
我虚拟机里的Linux是自己DIY的,为了在里面编译一个Hello world,我把一个已经装有gcc的系统里的gcc命令、库 复制(主要复制了/usr/include 和 usr/lib 里面的文件)到虚拟机里的相应目录(我从复制gcc和ld程序开始,利用ldd和提示 把依赖的库一点一点复制到虚拟机里)直到可以利用gcc正常编译Hello world。
但是发现在虚拟机里利用
编译出来的程序会产生Segmentation fault:
但是静态链接hello world可以正常运行:
另外,执行:
可以在装有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 非静态链接产生段错误,还有以上的错误能不能看出需要再链接什么库?
但是发现在虚拟机里利用
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 非静态链接产生段错误,还有以上的错误能不能看出需要再链接什么库?
|
原来说过了,不同的Linux的库有可能不兼容(版本,关键是API和ABI)
后面那个链接错误是缺少异常库,即-lgcc_eh,但是异常库不同版本的ABI极容易发生更改,更别说还有sjlj/dw2异常之分了
后面那个链接错误是缺少异常库,即-lgcc_eh,但是异常库不同版本的ABI极容易发生更改,更别说还有sjlj/dw2异常之分了