Library 1
Library 1
Library 1
1 of 10
http://www.yolinux.com/TUTORIALS/LibraryArchives-Sta...
Search
search
Related YoLinux
Tutorials:
C++ Info, links
C++ String Class
C++ STL vector, list
Fork and exec
Sockets programming
Emacs and C/C++
37
This methodology, also known as "shared components" or "archive libraries", groups together multiple compiled
object code files into a single file known as a library. Typically C functions/C++ classes and methods which can be
shared by more than one application are broken out of the application's source code, compiled and bundled into a
library. The C standard libraries and C++ STL are examples of shared components which can be linked with your
code. The benefit is that each and every object file need not be stated when linking because the developer can
reference the individual library. This simplifies the multiple use and sharing of software components between
applications. It also allows application vendors a way to simply release an API to interface with an application.
Components which are large can be created for dynamic use, thus the library remain separate from the executable
reducing it's size and thus disk space used. The library components are then called by various applications for use
when needed.
Advanced VI
CGI in C++
Clearcase Commands
There are two Linux C/C++ library types which can be created:
Refresh
Settings
Sign in with your
Twitter account
Advertisements
Learning
HTML Code
HTML 4.0
Creating Web
Pages With
How To Learn
HTML
1. Static libraries (.a): Library of object code which is linked with, and becomes part of the application.
2. Dynamically linked shared object libraries (.so): There is only one form of this library but it can be used in two
ways.
1. Dynamically linked at run time but statically aware. The libraries must be available during compile/link
phase. The shared objects are not included into the executable component but are tied to the execution.
2. Dynamically loaded/unloaded and linked during execution (i.e. browser plug-in) using the dynamic linking
loader system functions.
HTML Tutorial
HTML Help
HTML
Language
Java
Libraries are typically names with the prefix "lib". This is true for all the C standard libraries. When linking, the
command line reference to the library will not contain the library prefix or suffix.
Thus the following link command: gcc src-file.c -lm -lpthread
The libraries referenced in this example for inclusion during linking are the math library and the thread library. They
are found in /usr/lib/libm.a and /usr/lib/libpthread.a.
Development
HTML Coding
ads
Note: The GNU compiler now has the command line option "-pthread" while older versions of the compiler specify
the pthread library explicitly with "-lpthread". Thus now you are more likely to see gcc src-file.c -lm -pthread
T 1357 - "...
the spider to
the y ..!!"
T 1357 - "... the
spider to the y
..!!"
Example files:
ctest1.c
void ctest1(int *i)
{
*i=5;
}
Linux Software
Dynamic Load
ctest2.c
Linux System
2 of 10
Free Information
Technology
Magazines and
Document Downloads
http://www.yolinux.com/TUTORIALS/LibraryArchives-Sta...
prog.c
#include <stdio.h>
void ctest1(int *);
void ctest2(int *);
Free Information
Technology Software
and Development
Magazine
Subscriptions and
Document Downloads
Digital Innovations
1051100
Accessor...
Digital Innovation...
New $5.74
int main()
{
int x;
ctest1(&x);
printf("Valx=%d\n",x);
Logitech 720p
Webcam C905
Logitech
New $87.99
return 0;
}
IOGEAR
GUC1284B USB to
Parallel Adap...
IOGEAR
New $21.24
Historical note: After creating the library it was once necessary to run the command: ranlib
symbol table within the archive. Ranlib is now embedded into the "ar" command.
ctest.a.
This created a
TRENDnet USB /
FireWire Adapter
for ...
TRENDnet
New $14.99
Note for MS/Windows developers: The Linux/Unix ".a" library is conceptually the same as the Visual C++ static ".lib"
libraries.
SanDisk Extreme 8
GB Class 10
SDHC F...
SanDisk
New $7.00
Jobs
Privacy Information
SAP CC - Convergent
Charging Consultant
Mumbai, Maharashtra,
India
Recruit 121 Limited
*.o
Pega Developer
Chicago, IL
Request
Technology-Robyn
Honquest
Storage Systems
Infrastructure Manager
Racine, WI
TeamBradley
Senior Hyperion
Essbase Analyst
If you look at the libraries in /lib/ and /usr/lib/ you will find both methodologies present. Linux developers are
not consistent. What is important is that the symbolic links eventually point to an actual library.
Marysville, OH
Systel Inc
Obiee Analyst
Seattle, WA
Promantis Inc
Compiler options:
-Wall:
Software Architect /
Senior...
Frankfurt am Main,
Hessen, Germany
Prodyna AG
Mobile Architect
Chicago, IL
Request Technology
.NET Developer
Software Engineer
Chicago, IL
Responsive Search, Inc.
Software Development
Engineer (SDE) 2
Library Links:
The link to /opt/lib/libctest.so allows the naming convention for the compile flag -lctest to work.
The link to /opt/lib/libctest.so.1 allows the run time binding to work. See dependency below.
Compile main program and link with shared object library:
Hyderabad, Andhra
Pradesh, India
Microsoft
Senior Software
Developer - GERMANY
Mnchen, Bayern,
Germany
Apollo Solutions Ltd
POWERED BY JOBTHREAD
Where the name of the library is libctest.so. (This is why you must create the symbolic links or you will get the
error "/usr/bin/ld: cannot find -lctest".)
The libraries will NOT be included in the executable but will be dynamically linked during runtime execution.
3 of 10
http://www.yolinux.com/TUTORIALS/LibraryArchives-Sta...
List Dependencies:
The shared library dependencies of the executable can be listed with the command: ldd
Example: ldd
name-of-executable
prog
Run Program:
Set path: export
Run: prog
LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH
Man Pages:
gcc - GNU C compiler
ld - The GNU Linker
ldd - List dependencies
Links:
LDP: Shared libraries
Library Path:
In order for an executable to find the required libraries to link with during run time, one must configure the system so
that the libraries can be found. Methods available: (Do at least one of the following)
1. Add library directories to be included during dynamic linking to the file /etc/ld.so.conf
Sample: /etc/ld.so.conf
/usr/X11R6/lib
/usr/lib
...
..
/usr/lib/sane
/usr/lib/mysql
/opt/lib
Add the library path to this file and then execute the command (as root) ldconfig to configure the linker
run-time bindings.
You can use the "-f file-name" flag to reference another configuration file if you are developing for different
environments.
See man page for command ldconfig.
OR
2. Add specified directory to library cache: (as root)
ldconfig -n /opt/lib
-n .
This will NOT permanently configure the system to include this directory. The information will be lost upon
system reboot.
OR
3. Specify the environment variable LD_LIBRARY_PATH to point to the directory paths containing the shared object
library. This will specify to the run time loader that the library paths will be used during execution to resolve
dependencies.
(Linux/Solaris: LD_LIBRARY_PATH, SGI: LD_LIBRARYN32_PATH, AIX: LIBPATH, Mac OS X: DYLD_LIBRARY_PATH, HP-UX:
SHLIB_PATH)
Example (bash shell): export
LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH
...
if [ -d /opt/lib ];
then
LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH
fi
...
export LD_LIBRARY_PATH
4 of 10
http://www.yolinux.com/TUTORIALS/LibraryArchives-Sta...
This instructs the run time loader to look in the path described by the environment variable LD_LIBRARY_PATH, to
resolve shared libraries. This will include the path /opt/lib.
Library paths used should conform to the "Linux Standard Base" directory structure.
Library Info:
The command "nm" lists symbols contained in the object file or shared library.
Use the command nm -D libctest.so.1.0
(or nm --dynamic libctest.so.1.0)
0000000000100988 A __bss_start
000000000000068c T ctest1
00000000000006a0 T ctest2
w __cxa_finalize
00000000001007b0 A _DYNAMIC
0000000000100988 A _edata
0000000000100990 A _end
00000000000006f8 T _fini
0000000000100958 A _GLOBAL_OFFSET_TABLE_
w __gmon_start__
00000000000005b0 T _init
w _Jv_RegisterClasses
Description
The symbol's value is absolute, and will not be changed by further linking.
Doubly defined symbol. If found, allow definition in another library to resolve dependency.
Library Versions:
Library versions should be specified for shared objects if the function interfaces are expected to change (C++
public/protected class definitions), more or fewer functions are included in the library, the function prototype changes
(return data type (int, const int, ...) or argument list changes) or data type changes (object definitions: class data
members, inheritance, virtual functions, ...).
The library version can be specified when the shared object library is created. If the library is expected to be
updated, then a library version should be specified. This is especially important for shared object libraries which are
dynamically linked. This also avoids the Microsoft "DLL hell" problem of conflicting libraries where a system upgrade
which changes a standard library breaks an older application expecting an older version of the the shared object
function.
Versioning occurs with the GNU C/C++ libraries as well. This often make binaries compiled with one version of the
GNU tools incompatible with binaries compiled with other versions unless those versions also reside on the system.
Multiple versions of the same library can reside on the same system due to versioning. The version of the library is
included in the symbol name so the linker knows which version to link with.
One can look at the symbol version used: nm
csub1.o
00000000 T ctest1
/lib/libc.so.6 | more
00000000 A GCC_3.0
00000000 A GLIBC_2.0
5 of 10
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
...
..
A
A
A
A
A
A
A
A
A
http://www.yolinux.com/TUTORIALS/LibraryArchives-Sta...
GLIBC_2.1
GLIBC_2.1.1
GLIBC_2.1.2
GLIBC_2.1.3
GLIBC_2.2
GLIBC_2.2.1
GLIBC_2.2.2
GLIBC_2.2.3
GLIBC_2.2.4
/lib/libutil-2.2.5.so
..
...
U strcpy@@GLIBC_2.0
U strncmp@@GLIBC_2.0
U strncpy@@GLIBC_2.0
...
..
Links:
Symbol versioning
GNU.org: ld
Use the notation extern "C" so the libraries can be used with C and C++. This statement prevents the C++
from name mangling and thus creating "unresolved symbols" when linking.
Load and unload the library libctest.so (created above), dynamically:
#include <stdio.h>
#include <dlfcn.h>
#include "ctest.h"
int main(int argc, char **argv)
{
void *lib_handle;
double (*fn)(int *);
int x;
char *error;
lib_handle = dlopen("/opt/lib/libctest.so", RTLD_LAZY);
if (!lib_handle)
{
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
fn = dlsym(lib_handle, "ctest1");
if ((error = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", error);
exit(1);
}
(*fn)(&x);
printf("Valx=%d\n",x);
dlclose(lib_handle);
return 0;
}
6 of 10
http://www.yolinux.com/TUTORIALS/LibraryArchives-Sta...
Explanation:
dlopen("/opt/lib/libctest.so", RTLD_LAZY);
Returns address to the function which has been loaded with the shared library..
Returns NULL if it fails.
Note: When using C++ functions, first use nm to find the "mangled" symbol name or use the extern
construct to avoid name mangling.
i.e. extern "C" void function-name();
"C"
Object code location: Object code archive libraries can be located with either the executable or the loadable
library. Object code routines used by both should not be duplicated in each. This is especially true for code which
use static variables such as singleton classes. A static variable is global and thus can only be represented once.
Including it twice will provide unexpected results. The programmer can specify that specific object code be linked
with the executable by using linker commands which are passed on by the compiler.
Use the "-Wl" gcc/g++ compiler flag to pass command line arguments on to the GNU "ld" linker.
Example makefile statement: g++ -rdynamic -o appexe $(OBJ) $(LINKFLAGS) -Wl,--whole-archive -L{AA_libs} -laa
-Wl,--no-whole-archive $(LIBS)
--whole-archive: This linker directive specifies that the libraries listed following this directive (in this case
AA_libs) shall be included in the resulting output even though there may not be any calls requiring its presence.
This option is used to specify libraries which the loadable libraries will require at run time.
-no-whole-archive: This needs to be specified whether you list additional object files or not. The gcc/g++
compiler will add its own list of archive libraries and you would not want all the object code in the archive
library linked in if not needed. It toggles the behavior back to normal for the rest of the archive libraries.
Man pages:
dlopen() - gain access to an executable object file
dclose() - close a dlopen object
dlsym() - obtain the address of a symbol from a dlopen object
dlvsym() - Programming interface to dynamic linking loader.
dlerror() - get diagnostic information
Links:
GNOME Glib dynamic loading of modules - cross platform API for dynamically loading "plug-ins".
7 of 10
http://www.yolinux.com/TUTORIALS/LibraryArchives-Sta...
the entire object and all of its member functions. Do this by passing a "C" class factory function which instantiates
the class.
The class ".h" file:
class Abc {
...
...
};
// Class factory "C" functions
typedef Abc* create_t;
typedef void destroy_t(Abc*);
This file is the source to the library. The "C" functions to instantiate (create) and destroy a class defined in the
dynamically loaded library where "Abc" is the C++ class.
Main executable which calls the loadable libraries:
// load the symbols
create_t* create_abc = (create_t*) dlsym(lib_handle, "create");
...
...
destroy_t* destroy_abc = (destroy_t*) dlsym(lib_handle, "destroy");
...
...
Pitfalls:
The new/delete of the C++ class should both be provided by the executable or the library but not split. This is
so that there is no surprise if one overloads new/delete in one or the other.
Links:
LinuxJournal.com: Dynamic Class Loading for C++ on Linux
dlopen howto
8 of 10
http://www.yolinux.com/TUTORIALS/LibraryArchives-Sta...
::LoadLibrary() - dlopen()
::GetProcAddress() - dlsym()
::FreeLibrary() - dlclose()
[Potential Pitfall]: Microsoft Visual C++ .NET compilers do not allow the linking controll that the GNU linker "ld"
allows (i.e. --whole-archive, -no-whole-archive). All symbols need to be resolved by the VC++ compiler for both the
loadable library and the application executable individually and thus it can cause duplication of libraries when the
library is loaded. This is especially bad when using static variables (i.e. used in singleton patterns) as you will get
two memory locations for the static variable, one used by the loadable library and the other used by the program
executable. This breaks the whole static variable concept and the singleton pattern. Thus you can not use a static
variable which is referenced by by both the loadable library and the application executable as they will be unique
and different. To use a unique static variable, you must pass a pointer to that static variable to the other module so
that each module (main executable and DLL library) can use the same instatiation. On MS/Windows you can use
shared memory or a memory mapped file so that the main executable and DLL library can share a pointer to an
address they both will use.
Cross platform (Linux and MS/Windows) C++ code snippet:
Include file declaration: (.h or .hpp)
class Abc{
public:
static Abc* Instance(); // Function declaration. Could also be used as a public class member function.
private:
static Abc *mInstance;
...
}
return mInstance ?
mInstance : (mInstance = (Abc*) MemoryMappedPointers::getPointer("Abc")) ?
mInstance : (mInstance = (Abc*) MemoryMappedPointers::createEntry("Abc",(void*)new Abc));
#else
// If pointer to instance of Abc exists (true) then return instance pointer
// else return a newly created pointer to an instance of Abc.
return mInstance ? mInstance : (mInstance = new Abc);
#endif
}
Windows linker will pull two instances of object, one in exe and one in loadable module. Specify one for both to use
by using memory mapped pointer so both exe and loadable library point to same variable or object.
Note that the GNU linker does not have this problem.
For more on singletons see the YoLinux.com C++ singleton software design pattern tutorial.
9 of 10
http://www.yolinux.com/TUTORIALS/LibraryArchives-Sta...
#endif
// Where retType is the pointer to a return type of the function
// This return type can be int, float, double, etc or a struct or class.
typedef retType* func_t;
// load the library ------------------------------------------------#ifdef WIN32
string nameOfLibToLoad("C:\opt\lib\libctest.dll");
lib_handle = LoadLibrary(TEXT(nameOfLibToLoad.c_str()));
if (!lib_handle) {
cerr << "Cannot load library: " << TEXT(nameOfDllToLoad.c_str()) << endl;
}
#else
string nameOfLibToLoad("/opt/lib/libctest.so");
lib_handle = dlopen(nameOfLibToLoad.c_str(), RTLD_LAZY);
if (!lib_handle) {
cerr << "Cannot load library: " << dlerror() << endl;
}
#endif
...
...
...
// load the symbols ------------------------------------------------#ifdef WIN32
func_t* fn_handle = (func_t*) GetProcAddress(lib_handle, "superfunctionx");
if (!fn_handle) {
cerr << "Cannot load symbol superfunctionx: " << GetLastError() << endl;
}
#else
// reset errors
dlerror();
// load the symbols (handle to function "superfunctionx")
func_t* fn_handle= (func_t*) dlsym(lib_handle, "superfunctionx");
const char* dlsym_error = dlerror();
if (dlsym_error) {
cerr << "Cannot load symbol superfunctionx: " << dlsym_error << endl;
}
#endif
...
...
...
// unload the library ----------------------------------------------#ifdef WIN32
FreeLibrary(lib_handle);
#else
dlclose(lib_handle);
#endif
Tools:
Man pages:
ar - create, modify, and extract from archives
ranlib - generate index to archive
nm - list symbols from object files
ld - Linker
ldconfig - configure dynamic linker run-time bindings
ldconfig -p : Print the lists of directories and candidate libraries stored in the current cache.
i.e. /sbin/ldconfig -p |grep libGL
ldd - print shared library dependencies
gcc/g++ - GNU project C and C++ compiler
man page to: ld.so - a.out dynamic linker/loader
Notes:
Direct loader to preload a specific shared library before all others: export LD_PRELOAD=/usr/lib/libXXX.so.x;
This is specified in the file /etc/ld.so.preload and extended with the environment variable
LD_PRELOAD.
Also see:
man page to: ld.so - a.out dynamic linker/loader
LD_PRELOAD and Linux function interception.
exec program.
Running Red Hat 7.1 (glibc 2.2.2) but compiling for Red Hat 6.2 compatibility.
See RELEASE-NOTES
export LD_ASSUME_KERNEL=2.2.5
. /usr/i386-glibc21-linux/bin/i386-glibc21-linux-env.sh
http://www.yolinux.com/TUTORIALS/LibraryArchives-Sta...
CC="colorgcc"
Links:
GNU: Libtool - script for portable shared library creation.
Suse.de: Discussion of improvement in ld.so for performance improvement.
LDP Library Howto
Books:
"Advanced Linux Programming"
by Mark Mitchell, Jeffrey Oldham, Alex Samuel, Jeffery Oldham
ISBN # 0735710430, New Riders
Good book for programmers who already know how to program and just
need to know the Linux specifics. Covers a variety of Linux tools, libraries,
API's and techniques. If you don't know how to program, start with a book
on C.
"Linux Programming Bible"
by John Goerzen
ISBN # 0764546570, Hungry Minds, Inc
This covers the next step after "C" programming 101.
to top of page
37
StumbleUpon
3,029
10 of 10