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.