go怎么在linux下linux 调用静态库动态库

linux 下动态库、静态库嵌套使用
编辑:www.fx114.net
本篇文章主要介绍了"linux 下动态库、静态库嵌套使用",主要涉及到linux 下动态库、静态库嵌套使用方面的内容,对于linux 下动态库、静态库嵌套使用感兴趣的同学可以参考一下。
linux下静态库嵌套使用
前提是你会在linux下调用静态库和动态库和Makfile编程(当然不会Makfile直接在终端命令也成)
本例是先由StringLen.h,StringLen.c生成librak.a
然后利用StringLen2.h,StringLen2.并调用librak.a生成librak2.a
最后利用StringLen3.h,StringLen3.c调用librak2.a 生成librak3.so
--------------------------------------------------------------------------------------
#StringLen.h:
#ifndef _STRINGLEN_H__
#define _STRINGLEN_H__
int Strlen(char *pStr);
#StringLen.c:
#include&stdio.h&
#include&assert.h&
#include &StringLen.h&
int& Strlen(char& *pStr)
&&& unsigned& long& ulL
&&& assert(NULL& !=& pStr);
&&& ulLength& =& 0;
&&& while(*pStr++)
&&& {&&&&&&&&&&&&&&&&
&&& &&& ulLength++;
&&& return& ulL
gcc -Wall -c *.c
ar rc librak.a *.o
------------------------------------------------------------------------------------
#StringLen2.h:
#ifndef _STRINGLEN_H2__
#define _STRINGLEN_H2__
#ifdef __UDT
#include &StringLen.h&
int Strlen2(char *pStr);
#StringLen2.c:
#include&stdio.h&
#include&assert.h&
#include &StringLen2.h&
int& Strlen2(char *pStr)
&&& unsigned& long& ulL
&&& #ifdef __UDT
&&& ulLength& =& Strlen(pStr);
&&& &&& ulLength = -1;
&&& #endif
&&& return& ulL
gcc -Wall -c *.c -D__UDT
ar rc librak2.a *.o
-----------------------------------------------------------------------------------------
#StringLen3.h:
#ifndef _STRINGLEN_H3__
#define _STRINGLEN_H3__
#ifdef ___UDT
#include &StringLen2.h&
int Strlen3(char *pStr);
#StringLen3.c
#include&stdio.h&
#include&assert.h&
#include &StringLen3.h&
int& Strlen3(char *pStr)
&&& unsigned& long& ulL
&&& #ifdef ___UDT
&&& ulLength& =& Strlen(pStr);
&&& &&& ulLength = -1;
&&& #endif
&&& return& ulL
vpath %.h ./Source
objects=StringLen3.o
CFLAGS_H=-I./Source
CFLAGS_D=-D___UDT
CFLAGS_O=$(CFLAGS_H) $(CFLAGS_D)
CFLAGS_SO=-L. -lrak2 -lrak $(CFLAGS_O)
libDll.so:$(objects)
&&& $(CXX) -ggdb -fPIC -shared -o $@ $^ $(CFLAGS_SO)
StringLen3.o:StringLen3.c StringLen3.h
&&& $(CXX) -c& $& $(CFLAGS_O)
.PHONY:clean
&&& @rm -r libDll.so& *.o
--------------------------------------------------------------------------------
最后main.c调用libDll.so就ok了
版权声明:本文为博主原创文章,未经博主允许不得转载。
本文标题:
本页链接:linux如何使用动态链接库的全局变量
linux如何使用动态链接库的全局变量
09-02-27 &匿名提问 发布
我们知道动态链接的一个主要目的是共享内存,减少对内存的使用.普通应用程序对动态链接库中的函数链接通过.plt,.got这两个节实现,动态链接库之间的函数链接实现也是如此。考察库f.cint x=0;int inc(){x++;}汇编代码为ff 05 00 00 00 00       incl   0x0 1.这个动态链接库中有一个全局变量,2.当某个应用加载该库时,要对该变量重定位;并且多个应用加载该库时,库的加载起始地址可能不一致。3.要对不同的地址空间中的这个变量进行重定位,自然要修改引用了该全局变量的代码页,内核会COW,那么每个进程就有了该页的一个副本.不知是否就是这样处理的?如果是的话那么内存共享的效果就要大打折扣了.最好能够引入一种相对间接寻址的方式解决这个问题inc {relative-offset}..........x:00 00 00 00其中relative-offset是该指令到x的偏移.指令的执行是先计算处x的绝对地址 ip+relative-offset,然后对该地址处的内存进行操作如此一来,库内的函数调用和指令跳转,以及全局变量访问都可以是相对寻址,从而不需要修改代码页,实现完全的内存共享了
请登录后再发表评论!推荐这篇日记的豆列
······

我要回帖

更多关于 linux调用动态链接库 的文章

 

随机推荐