Linux/Unix动态链接库实例

使用nm查看文件中的符号。
例如代码:
cat sub1.c
-----------------------------------------------
#include <stdlib.h>

int prn1(char *str)
{
        printf("This is in sub1.d !!");
        printf("%s\n",str);
}
-----------------------------------------------
编译命令:
$cc -c sub1.c    (生成sub1.o)
$nm sub1.o
00000000 t gcc2_compiled.
         U printf
00000000 T prn1
$ld -G -o sub1.d sub1.o
$nm sub1.d
00001210 A _DYNAMIC
00001204 A _GLOBAL_OFFSET_TABLE_
00001260 A __bss_start
00001260 A _edata
00001260 A _end
000001eb A _etext
000001c8 t gcc2_compiled.
         U printf
000001c8 T prn1

调用方代码:
-----------------------------------------------
//#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
#include <unistd.h>

#define __MAIN__
#include "Debug.h"
#undef __MAIN__

#define DEF_DL_FILE "sub1.d"
#define DEF_DL_FUN "prn1"

main(int argc,char *argv[])
{
        void *handle;
        int (*prn)(char *str);
        char *error;
        char dlFileName[100],dlFileDir[100],dlFunName[50];

        memset(dlFunName,'\0',50);
        memset(dlFileDir,'\0',100);
        memset(dlFileName,'\0',100);

        getcwd(dlFileDir,100);
        if ( argc >= 2 )
                sprintf(dlFileName,"%s/%s",dlFileDir,argv[1]);
        else
                sprintf(dlFileName,"%s/%s",dlFileDir,DEF_DL_FILE);
        MsgStr(dlFileName);

        if ( argc == 3 )
                strcpy(dlFunName,argv[2]);
        else
                strcpy(dlFunName,DEF_DL_FUN);
        MsgStr(dlFunName);

        handle=dlopen(dlFileName,RTLD_LAZY);
        if (!handle)
        {
                fputs (dlerror(), stderr);
                exit(1);
        }
        Msg("After dlopen()!!");

        prn = dlsym(handle, dlFunName);
        if ((error = dlerror()) != NULL)
        {
                fputs(error, stderr);
                exit(1);
        }
        Msg("After dlsym()!!");

        prn("Good!!");
        Msg("After prn()!!");
        dlclose(handle);
        Msg("After dlclose()!!");
}
-----------------------------------------------
编译命令:
gcc -c main.c
gcc -o main.x main.o -ldl

-ldl启用动态链接库。

执行效果:
-----------------------------------------------
 :: dlFileName is string: /home/Mento/coding/c/dltst/sub1.d
 :: dlFunName is string: prn1
 :: Message: After dlopen()!!
 :: Message: After dlsym()!!
This is in sub1.d !!Good!!
 :: Message: After prn()!!
 :: Message: After dlclose()!!
-----------------------------------------------

转载于:https://www.cnblogs.com/Mento/archive/2005/11/05/269281.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值