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.