Linking Object Code
Code from library files, predefined or user -defined, is combined with object code from the source program at compile time on an as-needed basis. When programming in C/C++, additional library files containing the object code for system calls and library functions not contained in the standard library can be specified at compile time. This is done by using the -l compiler option, followed by the library name without the lib prefix and the .a extension. For example, the compilation command
linux$ gcc prgm.c -lm
indicates to the link-loader portion of the gcc compiler program that the math library object code found in libm.a should be combined with the object code created from the source program prgm.c . If a special library is needed that does not reside in the standard location, the compiler can be notified of this. The GNU compilers use the -L option, followed by the additional directory (or directories) to be searched. The processing of files passed on the command line to the compiler are done sequentially. Thus, linker options are usually placed at the end of the command sequence to avoid any undefined ( unresolved ) reference errors.
Be aware that library functions often require the inclusion of additional header files in the source program. The header files contain such information as the requisite function prototypes , macro definitions, and defined constants. Without the inclusion of the proper header files, the program will not compile correctly. Conversely, the program will not compile correctly if you include the proper header file(s) and forget to link in the associated library containing the object code! Such omissions are often the source of cryptic compiler error messages. For example, attempting to compile a C program with gcc that uses a math function (such as pow ) without linking in the math library generates the message
linux$ gcc m.c /tmp/ccjKMi3A.o: In function 'main': /tmp/ccjKMi3A.o(.text+0x15): undefined reference to 'pow' collect2: ld returned 1 exit status
The synopsis section of the manual page (see Appendix A) lists the names of header file(s) if they are required. When multiple inclusion files are indicated, the order in which they are listed in the source program should match the order specified in the manual pages. The order of the inclusion is important, as occasionally the inclusion of a specific header file will depend upon the inclusion of the previously referenced header file. This dependency relationship is most commonly seen as the need for inclusion of the header file prior to the inclusion of other system header files. The notation indicates that the header file types.h can be found in the usual place (most often /usr/include on a UNIX-based system) in the subdirectory sys .
EXERCISE
Examine the contents of the standard C library ( /usr/lib/libc.a ). How many printf - related functions are archived in the standard C library? |
EXERCISE
Are there any library functions/system calls that occur in more than one library? If so, name one and explain why this might be done. |