ºìÁªLinuxÃÅ»§
Linux°ïÖú

ΪLinux Ó¦ÓóÌÐò±àд DLL

·¢²¼Ê±¼ä:2006-02-22 00:32:34À´Ô´:ºìÁª×÷Õß:ºÎ¸ç
²å¼þºÍ DLL ͨ³£ÊÇÓÃÀ´ÎÞÐë±àдÕû¸öÐÂÓ¦ÓóÌÐò¶øÌí¼Ó¹¦Äܵļ«ºÃ·½·¨¡£ÔÚ Linux ÖУ¬²å¼þºÍ DLL ÒÔ¶¯Ì¬¿âÐÎʽʵÏÖ¡£µç×ÓÉÌÎñ¹ËÎʼæÉè¼Æʦ Allen Wilson ½éÉÜÁ˶¯Ì¬¿â²¢ÇÒÏòÄúÑÝʾÁËÈçºÎÔÚij¸öÓ¦ÓóÌÐòÕýÔÚÔËÐÐÖ®ºóʹÓö¯Ì¬¿âÀ´¸Ä±ä¸ÃÓ¦ÓóÌÐò¡£
Internet ä¯ÀÀÆ÷Óû§·Ç³£ÊìϤ²å¼þµÄ¸ÅÄî¡£´Ó Web ÉÏÏÂÔزå¼þ£¬Í¨³£ÕâЩ²å¼þΪä¯ÀÀÆ÷µÄÒôƵ¡¢ÊÓƵÒÔ¼°ÌØÊâЧ¹ûÌṩÔöÇ¿Ö§³Ö¡£Ò»°ãÀ´½²£¬ÔÚ²»¸ü¸ÄÔ­ÓÐÓ¦ÓóÌÐòµÄÇé¿öÏ£¬²å¼þΪÏÖÓÐÓ¦ÓóÌÐòÌṩй¦ÄÜ¡£

DLL ÊdzÌÐòº¯Êý£¬ËüÃÇÔÚÉè¼ÆºÍ¹¹½¨Ó¦ÓóÌÐòʱΪ¸Ã³ÌÐòËùÖª¡£Éè¼ÆÓ¦ÓóÌÐòµÄÖ÷³ÌÐòʱʹÓóÌÐò¿ò¼Ü»òµ×°å£¬ÕâЩ³ÌÐò¿ò¼Ü»òµ×°åÔÚÔËÐÐʱѡÔñÐÔµØ×°ÈëËùÐèµÄ dll£¬ÕâЩ dll λÓÚ´ÅÅÌÉÏͬÖ÷³ÌÐò·ÖÀëµÄһЩÎļþÖС£ÕâÒ»´ò°üºÍ¶¯Ì¬×°ÈëÌṩÁËÁé»îµÄÉý¼¶¡¢Î¬»¤¡¢ÒÔ¼°Ðí¿É²ßÂÔ¡£

Ëæ Linux Ò»Æ𽻸¶µÄ»¹Óм¸Ç§ÌõÃüÁîºÍÓ¦ÓóÌÐò£¬ËüÃÇÖÁÉÙ¶¼ÐèÒª libc ¿âº¯Êý¡£Èç¹û libc º¯ÊýÓëÿһ¸öÓ¦ÓóÌÐò¶¼´ò°üÔÚÒ»Æð£¬ÄÇô´ÅÅÌÉϽ«»á³öÏÖ¼¸Ç§¸öÏàͬº¯ÊýµÄ¸±±¾¡£Linux ¹¹½¨ÕâЩӦÓóÌÐò£¬ÒÔʹÓÃͨ³£ËùÐèµÄϵͳ¿âµÄµ¥¸öϵͳ¼¶¸±±¾£¬¶ø²»ÀË·Ñ´ÅÅ̿ռ䡣Linux ÉõÖÁ×öµÃ¸üºÃ£¬Ã¿¸öÐèÒª¹«¹²ÏµÍ³¿âº¯ÊýµÄ½ø³ÌʹÓõ¥¸öµÄϵͳ¼¶Äڵĸ±±¾£¬Ò»´ÎÐÔ½«¸Ã¸±±¾×°Èëµ½Äڴ沢Ϊ¸÷½ø³ÌËù¹²Ïí¡£
ÔÚ Linux ÖУ¬²å¼þºÍ dll ÒÔ¶¯Ì¬¿âÐÎʽʵÏÖ¡£±¾ÎĵÄÓàϲ¿·ÖÊÇÔÚÓ¦ÓóÌÐòÔËÐÐÖ®ºóʹÓö¯Ì¬¿â¸ü¸Ä¸ÃÓ¦ÓóÌÐòµÄʾÀý¡£

Linux ¶¯Ì¬Á´½Ó
Linux ÖеÄÓ¦ÓóÌÐòÒÔÒÔÏÂÁ½ÖÖ·½Ê½Ö®Ò»Á´½Óµ½Íⲿº¯Êý£ºÒªÃ´ÔÚ¹¹½¨Ê±Ó뾲̬¿â£¨lib*.a£©¾²Ì¬µØÁ´½Ó£¬²¢ÇÒ½«¿â´úÂë°üº¬ÔÚ¸ÃÓ¦ÓóÌÐòµÄ¿ÉÖ´ÐÐÎļþÀҪôÔÚÔËÐÐʱÓë¹²Ïí¿â£¨lib*.so£©¶¯Ì¬µØÁ´½Ó¡£Í¨¹ý¶¯Ì¬Á´½Ó×°ÈëÆ÷£¬½«¶¯Ì¬¿âÓ³Éä½øÓ¦ÓóÌÐòµÄ¿ÉÖ´ÐÐÄÚ´æÖС£ÔÚÆô¶¯Ó¦ÓóÌÐò֮ǰ£¬¶¯Ì¬Á´½Ó×°ÈëÆ÷½«ËùÐèµÄ¹²ÏíÄ¿±ê¿âÓ³Éäµ½Ó¦ÓóÌÐòµÄÄڴ棬»òÕßʹÓÃϵͳ¹²ÏíµÄÄ¿±ê²¢ÎªÓ¦ÓóÌÐò½âÎöËùÐèµÄÍⲿÒýÓá£ÏÖÔÚÓ¦ÓóÌÐò¾Í¿ÉÒÔÔËÐÐÁË¡£

×÷ΪʾÀý£¬ÏÂÃæÓÐÒ»¸öÑÝʾ Linux ÖжԶ¯Ì¬Á´½Ó¿âµÄȱʡʹÓõÄС³ÌÐò£º


ÒýÓÃ:
main()
{
printf("Hello world
");
}



µ±Ê¹Óà gcc ±àÒë hello.c ʱ£¬¾Í´´½¨ÁËÒ»¸öÃûΪ 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)



ʹÓÃÏàͬµÄ¶¯Ì¬Á´½Ó×°ÈëÆ÷ÔÚÓ¦ÓóÌÐòÔËÐÐÖ®ºó½« dll Ó³Éä½øÓ¦ÓóÌÐòµÄÄڴ档ͨ¹ýʹÓà Linux ¶¯Ì¬×°ÈëÆ÷Àý³Ì£¬Ó¦ÓóÌÐò¿ØÖÆ×°ÈëÄÄÒ»¸ö¶¯Ì¬¿âÒÔ¼°µ÷ÓÿâÖеÄÄÄÒ»¸öº¯Êý£¬ÒÔÖ´ÐÐ×°ÈëºÍÁ´½ÓÒÔ¼°·µ»ØËùÐèÈë¿ÚµãµÄµØÖ·¡£

Linux dll º¯Êý
Linux Ìṩ 4 ¸ö¿âº¯Êý£¨dlopen, dlerror, dlsym ºÍ dlclose£©£¬Ò»¸ö include Îļþ£¨dlfcn.h£©ÒÔ¼°Á½¸ö¹²Ïí¿â£¨¾²Ì¬¿â libdl.a ºÍ¶¯Ì¬¿â libdl.so£©£¬ÒÔÖ§³Ö¶¯Ì¬Á´½Ó×°ÈëÆ÷¡£ÕâЩ¿âº¯ÊýÊÇ:

dlopen ½«¹²ÏíÄ¿±êÎļþ´ò¿ª²¢ÇÒÓ³Éäµ½ÄÚ´æÖУ¬²¢ÇÒ·µ»Ø¾ä±ú
dlsym ·µ»ØÒ»¸öÖ¸Ïò±»ÇëÇóÈë¿ÚµãµÄÖ¸Õë
dlerror ·µ»Ø NULL »òÕßÒ»¸öÖ¸ÏòÃèÊö×î½ü´íÎóµÄ ASCII ×Ö·û´®µÄÖ¸Õë
dlclose ¹Ø±Õ¾ä±ú²¢ÇÒÈ¡Ïû¹²ÏíÄ¿±êÎļþµÄÓ³Éä

¶¯Ì¬Á´½Ó×°ÈëÆ÷Àý³Ì dlopen ÐèÒªÔÚÎļþϵͳÖвéÕÒ¹²ÏíÄ¿±êÎļþÒÔ´ò¿ªÎļþ²¢´´½¨¾ä±ú¡£ÓÐ 4 ÖÖ·½Ê½ÓÃÒÔÖ¸¶¨ÎļþµÄλÖãº

dlopen call Öеľø¶ÔÎļþ·¾¶
ÔÚ LD_LIBRARY_PATH »·¾³±äÁ¿ÖÐÖ¸¶¨µÄĿ¼ÖÐ
ÔÚ /etc/ld.so.cache ÖÐÖ¸¶¨µÄ¿âÁбíÖ®ÖÐ
ÏÈÔÚ /usr/lib Ö®ÖУ¬È»ºóÔÚ /lib Ö®ÖÐ

dll ʾÀý£ºÐ¡µÄ C ³ÌÐòºÍ dlTest
¶¯Ì¬Á´½Ó×°ÈëÆ÷ʾÀý³ÌÐòÊÇÒ»¸öСµÄ C ³ÌÐò£¬¸Ã³ÌÐò±»Éè¼ÆÓÃÀ´Á·Ï° dl Àý³Ì¡£¸Ã³ÌÐò»ùÓÚÿ¸öÈ˶¼±àд¹ýµÄÒ»¸ö C ³ÌÐò£¬Ëü½«¡°Hello World¡±´òÓ¡µ½¿ØÖÆ̨ÉÏ¡£×î³õ´òÓ¡µÄÏûÏ¢ÊÇ¡°HeLlO WoRlD¡±¡£¸Ã²âÊÔ³ÌÐòÁ´½Óµ½ÔٴδòÓ¡¸ÃÏûÏ¢µÄÁ½¸öº¯ÊýÉÏ£ºµÚÒ»´Î¶¼Óôóд×Ö·û£¬µÚ¶þ´Î¶¼ÓÃСд×Ö·û¡£
ÒÔÏÂÊǸóÌÐòµÄ¸ÅÒª£º

¶¨Òå dll include Îļþ dlfcn.h ºÍËùÐèµÄ±äÁ¿¡£ ÖÁÉÙÐèÒªÕâЩ±äÁ¿£º
µ½¹²Ïí¿âÎļþµÄ¾ä±ú
Ö¸Ïò±»Ó³É亯ÊýÈë¿ÚµãµÄÖ¸Õë
Ö¸Ïò´íÎó×Ö·û´®µÄÖ¸Õë


´òÓ¡³õʼÏûÏ¢£¬¡°HeLlO WoRlD¡±¡£


ʹÓþø¶Ô·¾¶¡°/home/dlTest/UPPERCASE.so¡±ºÍÑ¡Ïî RTLD_LAZY£¬dlopen ´ò¿ª UPPERCASE dll µÄ¹²ÏíÄ¿±êÎļþ²¢·µ»Ø¾ä±ú¡£
Ñ¡Ïî RTLD_LAZY ÍƳٽâÎö dll µÄÍⲿÒýÓã¬Ö±µ½ dll ±»Ö´ÐС£
Ñ¡Ïî RTLD_NOW ÔÚ dlopen ·µ»Ø֮ǰ½âÎöËùÓеÄÍⲿÒýÓá£


dlsym ·µ»ØÈë¿Úµã printUPPERCASE µÄµØÖ·¡£


µ÷Óà printUPPERCASE ²¢ÇÒ´òÓ¡Ð޸ĹýµÄÏûÏ¢¡°HELLO WORLD¡±¡£


dlclose ¹Ø±Õµ½ UPPERCASE.so µÄ¾ä±ú£¬²¢ÇÒ´ÓÄÚ´æÖÐÈ¡Ïû dll Ó³Éä¡£
dlopen ʹÓûùÓÚ»·¾³±äÁ¿ LD_LIBRARY_PATH µÄÏà¶Ô·¾¶²éÕÒ¹²ÏíÄ¿±ê·¾¶£¬À´´ò¿ª lowercase dll µÄ¹²ÏíÄ¿±êÎļþ lowercase.so£¬²¢ÇÒ·µ»Ø¾ä±ú¡£


dlsym ·µ»ØÈë¿Úµã printLowercase µÄµØÖ·¡£


µ÷Óà printLowercase ²¢ÇÒ´òÓ¡Ð޸ĹýµÄÐÅÏ¢¡°hello world¡±¡£


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)-




ÍêÕûµÄ dlTest.c¡¢UPPERCASE.c ºÍ lowercase.c Ô´´úÂëÇåµ¥ÔÚ±¾ÎĺóÃæµÄÇåµ¥Àï¡£

¹¹½¨ dlTest
ÆôÓÃÔËÐÐʱ¶¯Ì¬Á´½ÓÐèÒªÈý²½£º

½« dll ±àÒëΪλÖÃÎ޹شúÂë
´´½¨ dll ¹²ÏíÄ¿±êÎļþ
±àÒëÖ÷³ÌÐò²¢Í¬ dl ¿âÏàÁ´½Ó
±àÒë UPPERCASE.c ºÍ lowercase.c µÄ gcc ÃüÁî°üº¬ -fpic Ñ¡ÏѡÏî -fpic ºÍ -fPIC µ¼ÖÂÉú³ÉµÄ´úÂëÊÇλÖÃÎ޹صģ¬Öؽ¨¹²ÏíÄ¿±ê¿âÐèҪλÖÃÎ޹ء£-fPIC Ñ¡Ïî²úÉúλÖÃÎ޹صĴúÂ룬ÕâÀà´úÂëÖ§³Ö´óÆ«ÒÆ¡£ÓÃÓÚ UPPERCASE.o ºÍ lowercase.o µÄµÚ¶þ¸ö gcc ÃüÁ´øÓÐ -shared Ñ¡Ï¸ÃÑ¡Ïî²úÉúÊʺÏÓÚ¶¯Ì¬Á´½ÓµÄ¹²ÏíÄ¿±êÎļþ a*.so¡£

ÓÃÓÚ±àÒëºÍÖ´ÐÐ dltest µÄ ksh ½Å±¾ÈçÏ£º


ÒýÓÃ:
#!/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




½áÊøÓï
´´½¨ÄÜÔÚÔËÐÐʱ±»¶¯Ì¬Á´½Óµ½ Linux ϵͳÉϵÄÓ¦ÓóÌÐòµÄ¹²ÏíÄ¿±ê´úÂëÊÇÒ»Ïî·Ç³£¼òµ¥µÄÁ·Ï°¡£Ó¦ÓóÌÐòͨ¹ýʹÓöԶ¯Ì¬Á´½Ó×°ÈëÆ÷µÄ dlopen¡¢dlsym ºÍ dlclose º¯Êýµ÷ÓÃÀ´»ñÈ¡¶Ô¹²ÏíÄ¿±êÎļþµÄ·ÃÎÊ¡£dlerror ÒÔ×Ö·û´®µÄÐÎʽ·µ»ØÈκδíÎó£¬ÕâЩ´íÎóÐÅÏ¢×Ö·û´®ÃèÊö dl º¯ÊýÅöµ½µÄ×îºóÒ»¸ö´íÎó¡£ÔÚÔËÐÐʱ£¬Ö÷Ó¦ÓóÌÐòʹÓþø¶Ô·¾¶»òÏà¶ÔÓÚ LD_LIBRARY_PATH µÄÏà¶Ô·¾¶ÕÒµ½¹²ÏíÄ¿±ê¿â£¬²¢ÇÒÇëÇóËùÐèµÄ dll Èë¿ÚµãµÄµØÖ·¡£µ±ÐèҪʱ£¬Ò²¿É¶Ô dll ½øÐмä½Óº¯Êýµ÷Óã¬×îºó£¬¹Ø±Õµ½¹²ÏíÄ¿±êÎļþµÄ¾ä±ú£¬²¢ÇÒ´ÓÄÚ´æÖÐÈ¡Ïû¸ÃÄ¿±êÎļþÓ³É䣬ʹ֮²»¿ÉÓá£

ʹÓø½¼ÓÑ¡Ïî -fpic »ò -fPIC ±àÒë¹²ÏíÄ¿±ê´úÂ룬ÒÔ²úÉúλÖÃÎ޹صĴúÂ룬ʹÓà -shared Ñ¡ÏĿ±ê´úÂë·Å½ø¹²ÏíÄ¿±ê¿âÖС£

Linux ÖеĹ²ÏíÄ¿±ê´úÂë¿âºÍ¶¯Ì¬Á´½Ó×°ÈëÆ÷ÏòÓ¦ÓóÌÐòÌṩÁ˶îÍâµÄ¹¦ÄÜ¡£¼õÉÙÁË´ÅÅÌÉϺÍÄÚ´æÀïµÄ¿ÉÖ´ÐÐÎļþµÄ´óС¡£¿ÉÒÔÔÚÐèҪʱ£¬×°Èë¿ÉÑ¡µÄÓ¦ÓóÌÐò¹¦ÄÜ£¬¿ÉÒÔÔÚÎÞÐëÖØй¹½¨Õû¸öÓ¦ÓóÌÐòµÄÇé¿öÏÂÐÞÕýȱÏÝ£¬²¢ÇÒÓ¦ÓóÌÐò¿ÉÒÔ°üº¬µÚÈý·½µÄ²å¼þ¡£

Çåµ¥£¨Ó¦ÓóÌÐòºÍ dll£©


ÒýÓÃ:
dlTest.c:
/*************************************************************/
/* 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
#include

/* */
/* 1-dll include file and variables */
/* */
#include
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);
}





²Î¿¼×ÊÁÏ

ÔÚ IBM µÄ Linux Ó¦ÓóÌÐò¹¤¾ß zSeries ºÍ S/390 ϵͳ°æµÄÁбíÖУ¬½«»á·¢ÏÖÐí¶àÓÐÓõŤ¾ßÏäºÍ¿â¡£


ÏÂÔØ IBM developer kit for Linux.


ͬÑùÔÚ developerWorks ÉÏ£¬ÇëÔĶÁÏà¹ØÎÄÕ "shared objects for the object disoriented!".


ÔÚ developerWorks ÉÏä¯ÀÀ¸ü¶à Linux ²Î¿¼×ÊÁÏ¡£
ÔÚ developerWorks ÉÏä¯ÀÀ¸ü¶à¿ª·ÅÔ´Âë²Î¿¼×ÊÁÏ¡£

¹ØÓÚ×÷Õß
Allen Wilson ÔÚλÓÚÃÀ¹ú¿°Èø˹ÖÝ°Â˹͡µÄ IBM Èεç×ÓÉÌÎñÉè¼Æʦ¼æ¹ËÎÊ¡£ËûµÄר³¤ÁìÓò°üÀ¨ Linux¡¢AIX¡¢WebSphere Application Server ºÍÓ¦ÓóÌÐòÍйܡ£Äú¿ÉÒÔͨ¹ý wilsona@us.ibm.com ͬËûÁªÏµ¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ