Linux Libraries

From Teknologisk videncenter
Revision as of 12:28, 23 December 2018 by Heth (talk | contribs) (=Compiling and linking)
Jump to: navigation, search

Linux Libraries comes in two forms: Static and shared. Static libraries are linked at compile time while shared libraries are linked at runtime.

Static Libraries

Static libraries link needed code from the object (.o) files or an archive of object files into the binary file at compile time. See example below.

Static example

Pack three files file1.c, file2.c and file3.c to libfilearchive.a

  • file1.c is quite small
  • file2.c contains a const array of one megabyte
  • file3.c contains a const array of two megabyte

File1.c

//Author: Henrik Thomsen <heth@mercantec.dk>
//Name: file1.c
#include <stdio.h>
#define MB 1024*1024
void p1( void ) {
        // Initialize 1MB array first and last member
        // so we are sure the array is not truncated.
        const char txt[MB];// = {[0]=0x0ff, [MB-1]=0xff };
        printf("I am file1\n");
        printf("txt is %d bytes\n", sizeof(txt) );
}

File2.c

//Author: Henrik Thomsen <heth@mercantec.dk>
//Name: file2.c
#include <stdio.h>
void p2( void ) {
        printf("I am file2\n");
}

File3.c

//Author: Henrik Thomsen <heth@mercantec.dk>
//Name: file3.c
#include <stdio.h>
#define MB 1024*1024
void p3( void ) {
        // Initialize 2MB array first and last member
        // so we are sure the array is not truncated.
        const char txt[MB*2] = {[0]=0x0ff, [sizeof(txt)-1]=0xff };
        printf("I am file3\n");
        printf("txt is %d bytes\n", sizeof(txt) );
}

Creating libfilearchive.a

Notice the size of the object files from and the size of the .a archivefile. It contains all three .o files.

[heth@localhost ]$ gcc -c file1.c
[heth@localhost ]$ gcc -c file2.c
[heth@localhost ]$ gcc -c file3.c
[heth@localhost ]$ ar rc libfilearchive.a file1.o file2.o file3.o
[heth@localhost ]$ ls -l
-rw-rw-r--. 1 heth heth     334 Dec 23 10:32 file1.c
-rw-rw-r--. 1 heth heth 1050248 Dec 23 10:32 file1.o
-rw-rw-r--. 1 heth heth     125 Dec 23 10:26 file2.c
-rw-rw-r--. 1 heth heth    1496 Dec 23 10:31 file2.o
-rw-rw-r--. 1 heth heth     345 Dec 23 10:39 file3.c
-rw-rw-r--. 1 heth heth 2098824 Dec 23 10:40 file3.o
-rw-rw-r--. 1 heth heth 3150842 Dec 23 10:40 libfilearchive.a

Using the archive

Sourcefile containing main

This sourcefile only use functions from file1.c and file2.c - note that file3.c is not used.

//Author: Henrik Thomsen <heth@mercantec.dk>
//Name: hi.c
#include <stdio.h>

extern void p1( void );
extern void p2( void );

int main( void ) {
        printf("Starting main\n=============\n\n");
        p1();
        p2();
        return(0);
}

</source>

Compiling and linking

When using the archive link it in - and in this case add current directory to the linkers searchpath -L."

[heth@localhost ]$ gcc hi.c -lfilearchive -L. -o hi
[heth@localhost ]$ ./hi
Starting main
=============

I am file1
txt is 1048576 bytes
I am file2

Note: The size of the binary file hi proves that file3 is not linked in.

[heth@localhost libleg]$ ls -l
total 15432
-rw-rw-r--. 1 heth heth     334 Dec 23 10:32 file1.c
-rw-rw-r--. 1 heth heth 1050248 Dec 23 10:32 file1.o
-rw-rw-r--. 1 heth heth     125 Dec 23 10:26 file2.c
-rw-rw-r--. 1 heth heth    1496 Dec 23 10:31 file2.o
-rw-rw-r--. 1 heth heth     345 Dec 23 10:39 file3.c
-rw-rw-r--. 1 heth heth 2098824 Dec 23 10:40 file3.o
-rwxrwxr-x. 1 heth heth 1067104 Dec 23 11:25 hi
-rw-rw-r--. 1 heth heth     219 Dec 23 11:24 hi.c