来自两个C源文件的代码片段:
A.C
Channel *testChannelGet()
{
Channel *ch = channelGet (parser,parserCh);
return ch;
}
B.c
Channel *channelGet(UINT8 parser, UINT16 parserCh)
{
chnl.player = &solPlayer;
return((Channel *)&chnl);
}
我编译这两个文件并创建一个静态库和一个共享库。现在我从示例程序中调用testChannelGet。当我将它链接到静态库时,它完美地工作。但是,如果我将它链接到共享库,它的SEGFAULTing。调试告诉我,从channelGet返回的指针正在改变它返回的时刻。 GDB输出如下。
174 Channel *ch = channelGet (parser,parserCh);
(gdb) s
channelGet (parser=1 '\001', parserCh=1) at B.c:15174
15174 chnl.player = &solPlayer;
(gdb) n
15175 return((Channel *)&chnl);
(gdb) p ((Channel *)&chnl)
$1 = (Channel *) 0x7ffff7fed1a0
(gdb) n
15176 }
(gdb) n
testChannelGet at A.c:175
175 return ch;
(gdb) p ch
$2 = (Channel *) 0xfffffffff7fed1a0
现在地址值似乎指向不同的偏移量 - 0xfffffffff7fed1a0 vs 0x7ffff7fed1a0。两个地址中的最后一个字节是相同的。
任何提示?我试过-fPIC选项无济于事。
答案 0 :(得分:5)
channelGet()
中的A.c
范围内是否有原型?
如果没有,您看到的结果可以解释如下:
channelGet()
返回int
(由于缺少原型),因此结果被截断为0xf7fed1a0
0xfffffffff7fed1a0
(如果您在启用警告的情况下进行编译,您应该得到关于此的投诉......)
答案 1 :(得分:1)
在valgrind下运行您的程序。查找并修复其报告的任何错误。