Next Previous Contents

## 5. The GNU C Library

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)

## 5.1 Configuration

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.

## 5.2 Exercises

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.

## 5.3 More Information

- source code, see Building a Minimal Linux System from Source Code for urls

Next Previous Contents