g++很奇怪的问题,兄弟们帮帮老弟。

在做一个应用开发的时候突然发现一个问题,请Linux/Unix的大哥们讲解一下问题原因以及如何避免,谢谢!

状况如下:
a.cpp 文件

void init()
{
pthread_create(&pid, NULL, threadwork, NULL);
}

void threadwork(void *p)
{
printf("this is a thread");
}


g++ -fpic -shared -lc -o liba.so ./src/a.cpp -pthread
编译成动态链接库文件

b.cpp 文件

typedef void (*_initA)();

void threadwork(void *p)
{
printf("this is b thread");
}

int main(...)
{
void *pdlCoccHandle = dlopen("liba.so", RTLD_NOW);
_initA _init = (_initA)dlsym(pdlCoccHandle, "init");
_init();
}


g++ -fpic -o b ./src/b.cpp -pthread
编译成可执行文件

按照我的想法执行结果应该是输出
this is a thread
但是结果却是
this is b thread

请问这是怎么回事?????我想这应该是函数名字引起的问题,但是虽然两个函数名称相同但是他们所要执行的功能是不一样的(我想在内存中定一的地址也是不一样的)。请问g++对待这种情况是如何编译的?如何能够避免这种情况的发生?

---------------------------------------------------------------

我想可能就是这个原因吧,你打开-Wall 选项看看有没有warning什么的.

---------------------------------------------------------------

extern一下
---------------------------------------------------------------

up
---------------------------------------------------------------

你的程序我在solaris上试了一下coredump了

---------------------------------------------------------------

呵呵,说一下撒。。。
---------------------------------------------------------------

我们公司上不了msn不好意思。昨天晚上看了一下,其实符号表(GOT)只有在你程序中使用了这个符号才会登记,所以没有
pthread_t pid;
pthread_create(&pid, NULL, threadwork, NULL);
这两行的时候threadwork就不会在GOT中登记。当库中要使用的时候会去动态库的GOT中找相应的符号,而加了这两句threadwork就登记在符号表中,动态库运行的时候会使用错误的符号入口。

其实这个问题我以前也不注意,一般都加-fpic编译,现在知道,大家一起进步,哈哈哈

Published At
Categories with 服务器类
Tagged with
comments powered by Disqus