【问题标题】:Glibc link difference causing segmentation faultGlibc 链接差异导致分段错误
【发布时间】:2014-02-26 10:30:14
【问题描述】:

关于我构建的服务器的某些东西坏了(我不是唯一使用它的人......)。它是 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

与之前的工作版本相比:

  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

【问题讨论】:

  • 尝试从头开始重建,可能是旧的目标文件...
  • 我试过了。还用 printf 和 memset 创建了新程序,memset 也有同样的问题...
  • @user3194963 你有多确定这不是那个程序中的错误,即使它是一个非常简单的错误? (即向我们展示该测试程序,全部内容)。

标签: c linux gcc linker glibc


【解决方案1】:

您的程序以某种糟糕的方式重新定义了 memset 之类的函数(而不是使用 std 库提供的版本)。这可能是由某些标头引起的,这些标头可能是“标准”...也可能是您的编译器(gcc?)以某种方式生成(elf)代码,而不是您的平台...
您还说链接过程失败,您的意思是链接器失败并且无法生成可执行文件吗?

【讨论】:

  • 好吧,你对 GCC 的看法是对的。有人将 SLES 11 SP2 DVD 放入驱动器并将其安装为存储库。任何重新安装开发工具的尝试都会使其处于这种损坏状态。
【解决方案2】:

你说的失败(memset,printf)的功能被广泛使用,如果你的glibc真的那么坏,你在启动时永远不会到达shell。而且你肯定无法编译任何东西。我将首先查看它通过-L... 标志获取的库。检查LD_PRELOAD=... 是否以某种方式潜入。看看lddnm 告诉你什么。也许是 strace myprog 2&gt; /tmp/log 或在调试器下运行它可以清除谜团......

【讨论】:

  • 好吧 printf 不会失败(不同的库?),我是说我尝试的任何构建的 link 过程都失败了,而不是 glibc 本身。我已经尝试了其余的(以及 valgrind),但 elfread 输出看起来最相关。即使在汇编语言级别,您也无法在 gdb 中远远遵循它......
猜你喜欢
  • 1970-01-01
  • 2018-06-28
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多