The next thing that happens as your computer starts up is that init is loaded and run. However, init, like almost all programs, uses functions from libraries.
You may have seen an example C program like this:
main() { printf("Hello World!\n"); }
The program contains no definition of printf
, so where does it come from?
It comes from the standard C libraries, on a GNU/Linux system, glibc.
If you compile it under Visual C++, then it comes from a Microsoft
implementation of the same standard functions. There are zillions of
these standard functions, for math, string, dates/times memory allocation
and so on. Everything in Unix (including Linux) is either written in C
or has to try hard to pretend it is, so everything uses these functions.
If you look in /lib
on your linux system you will see lots of files called
libsomething.so
or libsomething.a
etc. They are libraries of these functions.
Glibc is just the GNU implementation of these functions.
There are two ways programs can use these library functions. If you statically
link a program, these library functions are copied into the executable that gets
created. This is what the libsomething.a
libraries are for. If you
dynamically link a program (and this is the default), then when the program
is running and needs the library code, it is called from the libsomething.so
file.
The command ldd
is your friend when you want to work out which
libraries are needed by a particular program. For example, here are the
libraries that bash
uses:
[greg@Curry power2bash]$ ldd /bin/bash libtermcap.so.2 => /lib/libtermcap.so.2 (0x40019000) libc.so.6 => /lib/libc.so.6 (0x4001d000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Some of the functions in the libraries depend on where you are. For example, in Australia we write dates as dd/mm/yy, but Americans write mm/dd/yy. There is a program that comes with the glibc
distribution called localedef
which enables you to set this up.
Use ldd
to find out what libraries your favourite applications use.
Use ldd
to find out what libraries init
uses.
Make a toy library, with just one or two functions in it. The program
ar
is used to create them, the man page for ar
might be a
good place to start investigating how this is done. Write, compile and link
a program that uses this library.