5

我正在尝试调试调用错误版本的函数导致段错误的问题。我正在编译的代码是机器生成的,并包含一个名为“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
4

2 回答 2

3

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

于 2012-11-02T22:51:54.657 回答
0

所以这个问题的真正答案是扔给-fno-builtin-timesgcc。这巧妙地避免了这个问题,没有大惊小怪。

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

于 2012-11-28T15:20:41.107 回答