Glibc链接差异导致分段错误

时间:2014-02-26 10:30:14

标签: c linux gcc linker glibc

关于我构建的服务器的某些内容被破坏了(我不是唯一使用它的人......)。这是SLES 11(没有SP)。我试过卸载并重新安装gcc,glibc等没有成功。

问题是我的内置程序段错误一旦遇到诸如memset或strlen之类的库函数(注意它是调用此函数而不是函数本身,参数很好)。我认为这肯定是错误的,我可以证明它与readelf的不同之处。例如:

# readelf -s myprog | grep memset
  247: 081461d0    52 <OS specific>: 10 GLOBAL DEFAULT   27 memset@GLIBC_2.0 (3)
  3530: 081461d0    52 <OS specific>: 10 GLOBAL DEFAULT   27 memset@@GLIBC_2.0

vs之前的工作版本说:

  69: 00000000     0 FUNC    GLOBAL DEFAULT  UND memset@GLIBC_2.0 (2)
  2035: 00000000     0 FUNC    GLOBAL DEFAULT  UND memset@@GLIBC_2.0

它是一个相当标准的makefile,没有任何改变。链接器标志为:

LDFLAGS = -L$(companylibrarypath) -lourcompanylibrary -L$(mysql_lib_path) -lmysqlclient -L/usr/tls/ -lpthread -pthread -lz -L$(curl_lib_path) -lcurl -lxslt

2 个答案:

答案 0 :(得分:1)

你的程序通过一些不好的方式重新定义了像memset这样的函数(而不是使用std库提供的版本)。它可能是由某些标题引起的,这可能是“标准的”...也可能是你的编译器(gcc?)通过某种方式生成(elf)代码不适合你的平台...
另外你说链接过程失败了,你的意思是链接器失败并且无法生成可执行文件吗?

答案 1 :(得分:0)

你说失败的功能(memset,printf)被广泛使用,如果你的glibc真的坏了,你在启动时就不会到达shell。而且你肯定无法编译任何东西。我首先通过-L...标志查看它正在拾取的库。检查LD_PRELOAD=...是否以某种方式偷偷摸摸。查看lddnm告诉您的内容。也许strace myprog 2> /tmp/log或在调试器下运行它可以清除错误......