关于我构建的服务器的某些内容被破坏了(我不是唯一使用它的人......)。这是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
答案 0 :(得分:1)
你的程序通过一些不好的方式重新定义了像memset这样的函数(而不是使用std库提供的版本)。它可能是由某些标题引起的,这可能是“标准的”...也可能是你的编译器(gcc?)通过某种方式生成(elf)代码不适合你的平台...
另外你说链接过程失败了,你的意思是链接器失败并且无法生成可执行文件吗?
答案 1 :(得分:0)
你说失败的功能(memset,printf)被广泛使用,如果你的glibc真的坏了,你在启动时就不会到达shell。而且你肯定无法编译任何东西。我首先通过-L...
标志查看它正在拾取的库。检查LD_PRELOAD=...
是否以某种方式偷偷摸摸。查看ldd
和nm
告诉您的内容。也许strace myprog 2> /tmp/log
或在调试器下运行它可以清除错误......