免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1873 | 回复: 7
打印 上一主题 下一主题

[函数] so内外函数冲突问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-19 18:36 |只看该作者 |倒序浏览
发现了一个问题,当动态加载so的程序与so内部有重名函数时,就会出现冲突。好像so里面能调用外面的函数。请问除了改名外有别的解决方法吗?是不是和编译选项有关系?

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
2 [报告]
发表于 2007-01-19 22:19 |只看该作者
在哪里发现的?

论坛徽章:
0
3 [报告]
发表于 2007-01-22 08:54 |只看该作者
是在solaris平台下,用c语言编写的程序,其实我试了一下,在linux下也是一样。可能我说的不明白,就是下面这个意思:

在testso.c中
#include<stdio.h>
int test()
{
    printf("asdf\n");
    return 0;
}

int exproc(const char *sArg)
{
    char szBuf[1024];
    test();
    memset(szBuf, 0, 1024);
    sprintf(szBuf, "%s\n", sArg);   
    return 0;
}

gcc -c -fPIC testso.c
gcc -shared -W1 -o testso.so testso.o

在test.c中
#include <stdio.h>
#include <stdlib.h>
typedef int (*MYPROC)(const char *arg);
void test()
{
    printf("11111111111111\n");
}

int main(int argc, char* argv[])
{
    void *hinstLib = 0;
    MYPROC proc = NULL;

    hinstLib = dlopen("./testso.so", RTLD_LAZY);
    if (hinstLib != NULL)
    {
        proc = (MYPROC)dlsym(hinstLib, "exproc");
        proc("abc");
        dlclose(hinstLib);
    }
    else
    {
        printf("%s\n", dlerror());
    }

    return 0;
}
gcc -c  test.c
gcc -W1 -o test test.o -ldl

./test
输出结果是
11111111111111
abc

而不是
asdf
abc

论坛徽章:
0
4 [报告]
发表于 2007-01-22 08:55 |只看该作者
大家有什么好的方法解决这个问题吗?

论坛徽章:
0
5 [报告]
发表于 2007-01-22 09:33 |只看该作者
你把函数声明成static 类型的就可以了

论坛徽章:
0
6 [报告]
发表于 2007-01-22 10:48 |只看该作者
谢谢linternt,果然可以了。不过有点想不通道理

论坛徽章:
0
7 [报告]
发表于 2007-01-22 15:48 |只看该作者
声明成static表示函数在文件内有效,函数生命期的问题

论坛徽章:
0
8 [报告]
发表于 2007-01-22 23:47 |只看该作者
>> 声明成static表示函数在文件内有效,函数生命期的问题

不,函数没有所谓“生命期”的概念,只有对象才有。

在这里涉及到的是函数(标示符)的作用范围的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP