C程序链接到错误的功能版本

时间:2012-11-02 22:45:56

标签: c linker glibc

我正在尝试调试错误版本的函数被调用导致段错误的问题。我正在编译的代码是机器生成的,包含一个名为'times'的函数,它复杂地对它的两个参数进行乘法运算。在链接到更高级别的目标文件之前,此代码被编译为.o。

运行此代码时,segfaults和gdb表明它位于glibc的'times'版本中,它甚至不会使用相同数量的参数。这个代码中没有'#include任何地方。

将时间名称更改为times1可解决问题。这不是一个长期的解决方案,但由于机器生成的代码性质和手动编辑此函数的名称一直没有吸引力。

整个烂摊子用-Wall编译清洁所以我不确定在哪里看。关于如何解决这个问题的任何想法?

Compile chain:
    gcc -Wall -I. -g --shared -o dpd.o -fPIC *.c (mahine generated code here)
    gcc -g --std=c99 -c -fpic getData.c -I/usr/local/include -L/usr/local/lib -lmatio -I/usr/local/include/iverilog -I$(MATLAB)
    gcc -g -shared -o getData.vpi getData.o $(MATLAB)/dpd.o -lvpi -lmatio -L/usr/local/lib

2 个答案:

答案 0 :(得分:3)

C仅使用函数的名称作为标识符,因此任何具有相同名称的两个(导出的)函数都会发生冲突。正常的approch是为库中具有唯一前缀的所有导出名称添加前缀。另一种方法是使用C ++作为“更好的C”,并使用C ++编译器简单地构建C代码,利用C ++名称修改。

答案 1 :(得分:0)

所以这个问题的真正答案是将-fno-builtin-times抛给gcc。这样可以毫不费力地避免这个问题。

这当然假设您不能将times的名称更改为与glibc提供的函数不冲突的内容。