• 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()!!
    -----------------------------------------------

  • 相关阅读:
    IOS数据持久化之归档NSKeyedArchiver
    Java中导入、导出Excel
    IOS开发中多线程的使用
    深入分析动态管理Fragment
    IOS开发之数据sqlite使用
    如何在Eclipse和Tomcat的Debug过程中启用热部署
    在PHP中无法连接Memcached的解决办法
    Apache mod_rewrite规则重写的标志一览
    Java多线程中run(), start(), join(), wait(), yield(), sleep()的使用
    Centos5.8下编译安装PHP5.4和memcached, phalcon, yaf, apc
  • 原文地址:https://www.cnblogs.com/Mento/p/269281.html
Copyright © 2020-2023  润新知