Defining Symbol References

The following example shows how three symbol references can be defined. These references are then used to extract members of an archive. Although this archive extraction can be achieved by specifying multiple -u options to the link-edit, this example also shows how the eventual scope of a symbol can be reduced to local.

$ cat foo.c
#include    <stdio.h>

void foo()
{
        (void) printf("foo: called from lib.a\n");
}
$ cat bar.c
#include    <stdio.h>

void bar()
{
        (void) printf("bar: called from lib.a\n");
}
$ cat main.c
extern void foo(), bar();

void main()
{
        foo();
        bar();
}
$ cc -c foo.c bar.c main.c
$ ar -rc lib.a foo.o bar.o main.o
$ cat mapfile
$mapfile_version 2
SYMBOL_SCOPE {
        local:
                foo;
                bar;
        global:
                main;
};
$ cc -o prog -M mapfile lib.a
$ prog
foo: called from lib.a
bar: called from lib.a
$ elfdump -sN.symtab prog | egrep 'main$|foo$|bar$'
    [29]   0x10f30  0x24  FUNC LOCL  H    0 .text          bar
    [30]   0x10ef8  0x24  FUNC LOCL  H    0 .text          foo
    [55]   0x10f68  0x24  FUNC GLOB  D    0 .text          main

The significance of reducing symbol scope from global to local is covered in more detail in the section Reducing Symbol Scope.