- 浏览: 2042400 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
在仅仅只会编写插件的时候为什么要编写整个应用程序? 级别: 初级 Allen Wilson (wilsona@us.ibm.com), 电子商务设计师, IBM 2001 年 10 月 01 日 Internet 浏览器用户非常熟悉插件的概念。从 Web 上下载插件,通常这些插件为浏览器的音频、视频以及特殊效果提供增强支持。一般来讲,在不更改原有应用程序的情况下,插件为现有应用程序提供新功能。 DLL 是程序函数,它们在设计和构建应用程序时为该程序所知。设计应用程序的主程序时使用程序框架或底板,这些程序框架或底板在运行时选择性地装入所需的 dll,这些 dll 位于磁盘上同主程序分离的一些文件中。这一打包和动态装入提供了灵活的升级、维护、以及许可策略。 随 Linux 一起交付的还有几千条命令和应用程序,它们至少都需要 libc 库函数。如果 libc 函数与每一个应用程序都打包在一起,那么磁盘上将会出现几千个相同函数的副本。Linux 构建这些应用程序,以使用通常所需的系统库的单个系统级副本,而不浪费磁盘空间。Linux 甚至做得更好,每个需要公共系统库函数的进程使用单个的系统级内的副本,一次性将该副本装入到内存并为各进程所共享。 在 Linux 中,插件和 dll 以动态库形式实现。本文的余下部分是在应用程序运行之后使用动态库更改该应用程序的示例。 Linux 中的应用程序以以下两种方式之一链接到外部函数:要么在构建时与静态库( 作为示例,下面有一个演示 Linux 中对动态链接库的缺省使用的小程序: 当使用 gcc 编译 hello.c 时,就创建了一个名为 使用相同的动态链接装入器在应用程序运行之后将 dll 映射进应用程序的内存。通过使用 Linux 动态装入器例程,应用程序控制装入哪一个动态库以及调用库中的哪一个函数,以执行装入和链接以及返回所需入口点的地址。 Linux 提供 4 个库函数( 动态链接装入器例程 dlopen 需要在文件系统中查找共享目标文件以打开文件并创建句柄。有 4 种方式用以指定文件的位置: 动态链接装入器示例程序是一个小的 C 程序,该程序被设计用来练习 dl 例程。该程序基于每个人都编写过的一个 C 程序,它将“Hello World”打印到控制台上。最初打印的消息是“HeLlO WoRlD”。该测试程序链接到再次打印该消息的两个函数上:第一次都用大写字符,第二次都用小写字符。 以下是该程序的概要: 注意,每次调用 完整的 dlTest.c、UPPERCASE.c 和 lowercase.c 源代码清单在本文后面的 清单里。 启用运行时动态链接需要三步: 编译 UPPERCASE.c 和 lowercase.c 的 gcc 命令包含 -fpic 选项。选项 -fpic 和 -fPIC 导致生成的代码是位置无关的,重建共享目标库需要位置无关。-fPIC 选项产生位置无关的代码,这类代码支持大偏移。用于 UPPERCASE.o 和 lowercase.o 的第二个 gcc 命令,带有 -shared 选项,该选项产生适合于动态链接的共享目标文件 a*.so。 用于编译和执行 dltest 的 ksh 脚本如下: 创建能在运行时被动态链接到 Linux 系统上的应用程序的共享目标代码是一项非常简单的练习。应用程序通过使用对动态链接装入器的 dlopen、dlsym 和 dlclose 函数调用来获取对共享目标文件的访问。dlerror 以字符串的形式返回任何错误,这些错误信息字符串描述 dl 函数碰到的最后一个错误。在运行时,主应用程序使用绝对路径或相对于 LD_LIBRARY_PATH 的相对路径找到共享目标库,并且请求所需的 dll 入口点的地址。当需要时,也可对 dll 进行间接函数调用,最后,关闭到共享目标文件的句柄,并且从内存中取消该目标文件映射,使之不可用。 使用附加选项 -fpic 或 -fPIC 编译共享目标代码,以产生位置无关的代码,使用 -shared 选项将目标代码放进共享目标库中。 Linux 中的共享目标代码库和动态链接装入器向应用程序提供了额外的功能。减少了磁盘上和内存里的可执行文件的大小。可以在需要时,装入可选的应用程序功能,可以在无须重新构建整个应用程序的情况下修正缺陷,并且应用程序可以包含第三方的插件。
为 Linux 应用程序编写 DLL
文档选项
插件和 DLL 通常是用来无须编写整个新应用程序而添加功能的极好方法。在 Linux 中,插件和 DLL 是以动态库形式实现的。电子商务顾问兼设计师 Allen Wilson 介绍了动态库,并且向您演示了如何在某一个应用程序正在运行之后使用动态库来更改该应用程序。
lib*.a
) 静态地链接,并且将库代码包含在该应用程序的可执行文件里;要么在运行时与共享库( lib*.so
) 动态地链接。通过动态链接装入器,将动态库映射进应用程序的可执行内存中。在启动应用程序之前,动态链接装入器将所需的共享目标库映射到应用程序的内存,或者使用系统共享的目标并为应用程序解析所需的外部引用。现在应用程序就可以运行了。
main()
{
printf("Hello world
");
}
a.out
的可执行文件。通过使用 Linux 命令 ldd a.out
(该命令打印出共享库的相互依赖性),可以看出所需的共享库是:
libc.so.6 => /lib/libc.so.6 (0x4001d000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
回页首
dlopen
, dlerror
, dlsym
和 dlclose
),一个 include 文件( dlfcn.h
)以及两个共享库(静态库 libdl.a
和动态库 libdl.so
),以支持动态链接装入器。这些库函数是:
dlopen call
中的绝对文件路径
回页首
dlfcn.h
和所需的变量。 至少需要这些变量:
dlopen
打开 UPPERCASE dll 的共享目标文件并返回句柄。
dlopen
返回之前解析所有的外部引用。dlsym
返回入口点 printUPPERCASE 的地址。
dlclose
关闭到 UPPERCASE.so 的句柄,并且从内存中取消 dll 映射。
dlopen
使用基于环境变量 LD_LIBRARY_PATH 的相对路径查找共享目标路径,来打开 lowercase dll 的共享目标文件 lowercase.so,并且返回句柄。
dlsym
返回入口点 printLowercase 的地址。
dlclose
关闭到 lowercase.so 的句柄,并且从内存中取消 dll 映射。dlopen
、 dlsym
或 dlclose
之后,调用 dlerror
以获取最后的错误信息,并且打印该错误信息字符串。以下是 dlTest 的测试运行:
dlTest 2-Original message
HeLlO WoRlD
dlTest 3-Open Library with absolute path return-(null)-
dlTest 4-Find symbol printUPPERCASE return-(null)-
HELLO WORLD
dlTest 5-printUPPERCASE return-(null)-
dlTest 6-Close handle return-(null)-
dlTest 7-Open Library with relative path return-(null)-
dlTest 8-Find symbol printLowercase return-(null)-
hello world
dlTest 9-printLowercase return-(null)-
dlTest 10-Close handle return-(null)-
回页首
#!/bin/ksh
# Build shared library
#
#set -x
clear
#
# Shared library for dlopen absolute path test
#
if [ -f UPPERCASE.o ]; then rm UPPERCASE.o
fi
gcc -c -fpic UPPERCASE.c
if [ -f UPPERCASE.so ]; then rm UPPERCASE.so
fi
gcc -shared -lc -o UPPERCASE.so UPPERCASE.o
#
# Shared library for dlopen relative path test
#
export LD_LIBRARY_PATH=`pwd`
if [ -f lowercase.o ]; then rm lowercase.o
fi
gcc -c -fpic lowercase.c
if [ -f lowercase.so ]; then rm lowercase.so
fi
gcc -shared -lc -o lowercase.so lowercase.o
#
# Rebuild test program
#
if [ -f dlTest ]; then rm dlTest
fi
gcc -o dlTest dlTest.c -ldl
echo Current LD_LIBRARY_PATH=$LD_LIBRARY_PATH
dlTest
回页首
回页首
/*************************************************************/
/* Test Linux Dynamic Function Loading */
/* */
/* void *dlopen(const char *filename, int flag) */
/* Opens dynamic library and return handle */
/* */
/* const char *dlerror(void) */
/* Returns string describing the last error. */
/* */
/* void *dlsym(void *handle, char *symbol) */
/* Return pointer to symbol's load point. */
/* If symbol is undefined, NULL is returned. */
/* */
/* int dlclose (void *handle) */
/* Close the dynamic library handle. */
/* */
/* */
/* */
/*************************************************************/
#include<stdio.h>
#include <stdlib.h>
/* */
/* 1-dll include file and variables */
/* */
#include <dlfcn.h>
void *FunctionLib; /* Handle to shared lib file */
int (*Function)(); /* Pointer to loaded routine */
const char *dlError; /* Pointer to error string */
main( argc, argv )
{
int rc; /* return codes */
char HelloMessage[] = "HeLlO WoRlD\n";
/* */
/* 2-print the original message */
/* */
printf(" dlTest 2-Original message \n");
printf("%s", HelloMessage);
/* */
/* 3-Open Dynamic Loadable Libary with absolute path */
/* */
FunctionLib = dlopen("/home/dlTest/UPPERCASE.so",RTLD_LAZY);
dlError = dlerror();
printf(" dlTest 3-Open Library with absolute path return-%s- \n", dlError);
if( dlError ) exit(1);
/* */
/* 4-Find the first loaded function */
/* */
Function = dlsym( FunctionLib, "printUPPERCASE");
dlError = dlerror();
printf(" dlTest 4-Find symbol printUPPERCASE return-%s- \n", dlError);
if( dlError ) exit(1);
/* */
/* 5-Execute the first loaded function */
/* */
rc = (*Function)( HelloMessage );
printf(" dlTest 5-printUPPERCASE return-%s- \n", dlError);
/* */
/* 6-Close the shared library handle */
/* Note: after the dlclose, "printUPPERCASE" is not loaded */
/* */
rc = dlclose(FunctionLib);
dlError = dlerror();
printf(" dlTest 6-Close handle return-%s-\n",dlError);
if( rc ) exit(1);
/* */
/* 7-Open Dynamic Loadable Libary using LD_LIBRARY path */
/* */
FunctionLib = dlopen("lowercase.so",RTLD_LAZY);
dlError = dlerror();
printf(" dlTest 7-Open Library with relative path return-%s- \n", dlError);
if( dlError ) exit(1);
/* */
/* 8-Find the second loaded function */
/* */
Function = dlsym( FunctionLib, "printLowercase");
dlError = dlerror();
printf(" dlTest 8-Find symbol printLowercase return-%s- \n", dlError);
if( dlError ) exit(1);
/* */
/* 8-execute the second loaded function */
/* */
rc = (*Function)( HelloMessage );
printf(" dlTest 9-printLowercase return-%s- \n", dlError);
/* */
/* 10-Close the shared library handle */
/* */
rc = dlclose(FunctionLib);
dlError = dlerror();
printf(" dlTest 10-Close handle return-%s-\n",dlError);
if( rc ) exit(1);
return(0);
}
UPPERCASE.c:
/************************************************/
/* Function to print input string as UPPER case. */
/* Returns 1. */
/*********************************************** */
int printUPPERCASE ( inLine )
char inLine[];
{
char UPstring[256];
char *inptr, *outptr;
inptr = inLine;
outptr = UPstring;
while ( *inptr != '\0' )
*outptr++ = toupper(*inptr++);
*outptr++ = '\0';
printf(UPstring);
return(1);
}
lowercase.c
/********************************************/
/* Function to print input string as lower case. */
/* Returns 2. */
/******************************************* */
int printLowercase( inLine )
char inLine[];
{
char lowstring[256];
char *inptr, *outptr;
inptr = inLine;
outptr = lowstring;
while ( *inptr != '' )
*outptr++ = tolower(*inptr++);
*outptr++ = '';
printf(lowstring);
return(2);
}
发表评论
-
多机器执行ssh脚本
2012-08-30 18:12 2249#!/bin/bash Usage() { ... -
Berkeley DB 使用经验总结
2012-08-27 14:41 3097作者:陈磊 NoSQL是现在互联网Web2.0时代备受 ... -
嵌入式数据库系统Berkeley DB
2012-08-27 14:37 1543前言 UNIX/LINUX平台下的数据库种类非常多 ... -
shell中双引号的误用
2011-05-12 15:02 1191for i in "$LIST" ... -
shell for循环
2011-04-06 15:36 1013for i in "1 2 3";do e ... -
shell技巧 除法
2011-03-07 11:34 19200shell计算中使用除法,基本默认上都是整除。 比如: ... -
.bash_profile 文件修改之后不执行
2011-02-16 11:21 1959重新登录 不可能不好用的 除非你是从一个用户su oralc ... -
SecureCRT中文显示乱码的解决方法
2011-02-12 11:38 1359最近开始用SecureCRT登陆linux系统,由于是新手,很 ... -
让putty显示中文
2011-02-11 14:43 1441对于经常在windows下远程ssh到linux的用户而言,p ... -
Linux文件类型全解析
2011-01-04 15:13 1416Linux文件类型全解析 ... -
Linux进程状态解析之T、Z、X
2011-01-04 15:09 1854摘要: Linux系统中进程有很多种 ... -
Linux进程状态解析之R、S、D
2011-01-04 14:54 4898摘要: Linu ... -
shell获取参数
2010-12-31 15:29 4205#!/bin/bash Usage() { ... -
Shell实现cgi接口示例
2010-12-30 14:59 2016ls -l /var/www/cgi-bin/ -rwxrw ... -
shell数组
2010-12-29 16:48 1311shell数组 Bash中还可以使用数 ... -
shell 自动化处理
2010-12-29 15:52 1050#!/bin/bash sudo yum instal ... -
Linux用户添加sudoer
2010-12-29 11:37 25184使用sudo可以在以非root用户登录时临时获得root权限, ... -
lsof:一个功能强大的命令
2010-12-24 16:30 1360lsof:一个功能强大的命令 lsof命令的原始功能 ... -
linux 的库操作命令 ar和nm
2010-12-22 20:31 1413当我们的程序中有经 ... -
LINUX查看硬件配置 命令
2010-12-21 18:55 1084常用命令整理如下: 查看主板的序列号: dmidec ...
相关推荐
在Linux中,应用程序可以通过两种方式链接到外部函数:静态链接和动态链接。静态链接将库的代码直接嵌入到可执行文件中,而动态链接则在运行时加载库。动态链接由动态链接装入器(Dynamic Link Loader)处理,它负责...
创建能在运行时被动态链接到 Linux 系统上的应用程序的共享目标代码是一项非常简单的练习。应用程序通过使用对动态链接装入器的 dlopen、dlsym 和 dlclose 函数调用来获取对共享目标文件的访问。在运行时,主应用...
本篇文章将详细探讨如何使用C语言编写DLL以及如何在C语言程序中调用这些DLL。 首先,创建C语言的DLL需要以下步骤: 1. **定义函数接口**:在DLL中,你需要定义对外公开的函数。这些函数的声明通常放在一个头文件中...
6. **编译和运行**:编译Java代码,并运行Java应用程序,JNI会自动调用本地方法,实现Java与C/C++的交互。 标签中提到了"NDK",这是Android Native Development Kit的缩写,它允许开发者在Android应用中使用C和C++...
在Linux系统中运行C#程序可能会让一些开发者感到陌生,因为C#主要与Microsoft的.NET框架和Windows操作系统关联。然而,随着.NET Core的发布,C#已经成为跨平台开发的重要选择,包括在Linux上。本资源提供了在Linux...
在编程领域,动态链接库(DLL)是一种共享代码的方式,它可以被多个应用程序同时使用,以减少内存占用和提高代码重用。Lazarus是Free Pascal编译器的集成开发环境(IDE),它提供了类似Delphi的界面和组件,用于创建...
- JNI为Java应用程序提供了一个桥梁,可以调用本地代码(如C++),反之亦然。这使得开发者可以在必要时利用C++的性能优势或者调用系统级API。 - Java程序通过`System.loadLibrary`或`java.lang.reflect.Method`来...
在IT行业中,开发跨平台的应用程序是常见的需求。Delphi是一种强大的对象 Pascal 编程语言,通常用于Windows环境,但通过使用第三方工具和特定技术,它也可以在Linux系统上创建应用。本篇将深入探讨如何使用Delphi...
总的来说,'rxtxParallel.dll'和'rxtxSerial.dll'是开发者进行硬件通信的重要工具,尤其对于那些需要与物理世界交互的Java应用程序来说,它们是必不可少的库文件。了解并熟练掌握这两个插件的使用,将极大地提升开发...
在Java中调用C++编写的DLL动态链接库时,可能会遇到“由于应用程序配置不正确,应用程序未能启动”的错误。这个错误通常是由于多种原因引起的,包括但不限于以下几点: 1. **JNI接口问题**:Java使用JNI(Java ...
使用 JNI 将 Java 应用程序与 C++ DLL 文件集成需要以下步骤:创建一个 Java 工程,生成 `.class` 文件,使用 `javah` 命令生成 `.h` 头文件,创建一个 C++ 工程,并将生成的 `.h` 头文件复制到工程中,编写 C++ ...
标题中的“socket编写windows和linux通讯程序-源码”指的是使用套接字(socket)编程技术,通过网络在Windows和Linux操作系统之间建立通信的程序。描述提到,该程序分为两个部分:服务器端(server)和客户端...
Qt Creator是其官方提供的集成开发环境(IDE),为开发者提供了便捷的图形化界面来编写、调试和构建Qt应用程序。本示例将探讨如何在Qt Creator中创建动态链接库(DLL)和应用程序,并演示如何在应用中调用DLL。 ...
"CUDA dll 创建方法" ... CUDA dll 创建方法的优点是可以将 CUDA 的计算能力与其他应用程序集成,从而提高应用程序的计算速度和效率。同时,CUDA dll 也可以在多种平台上使用,例如 Windows 和 Linux。
在这个基于Mini2440开发板的项目中,我们关注的是Linux下的定时器实现,尤其是如何在C语言环境下编写基本的驱动程序和应用程序。Mini2440是一款流行的S3C2440 ARM9开发板,常用于嵌入式系统的学习与开发。 首先,...
通过合理配置开发环境,学习OpenCV的基本使用方法,并按照开发流程进行程序的编写、编译、调试及测试,可以快速开发出满足需求的视频应用程序。 ### 注意事项 在实际开发过程中,可能会遇到一些问题,例如环境配置...
在IT行业中,有时我们需要在Java程序中调用C或C++编写的动态链接库(DLL)函数,以利用它们提供的特定功能。这个场景通常涉及到Java本地接口(JNI),这是一个允许Java代码与本地代码交互的机制。本文将详细介绍如何...
为了在Windows上使用OpenCV进行Java开发,你需要将此DLL文件放置在系统路径或者应用程序的类路径中,以便程序运行时可以找到并加载它。 对于Linux系统,OpenCV通常以共享库(.so文件)的形式存在。`libopencv_java...