The following example shows how two absolute symbol definitions can be defined. These definitions are then used to resolve the references from the input file main.c.
$ cat main.c #include <stdio.h> extern int foo(); extern int bar; void main() { (void) printf("&foo = 0x%p\n", &foo); (void) printf("&bar = 0x%p\n", &bar); } $ cat mapfile $mapfile_version 2 SYMBOL_SCOPE { global: foo { TYPE=FUNCTION; VALUE=0x400 }; bar { TYPE=DATA; VALUE=0x800 }; }; $ cc -o prog -M mapfile main.c $ prog &foo = 0x400 &bar = 0x800 $ elfdump -sN.symtab prog | egrep 'foo$|bar$' [45] 0x00000800 0x00000000 OBJT GLOB D 0 ABS bar [69] 0x00000400 0x00000000 FUNC GLOB D 0 ABS foo |
When obtained from an input file, symbol definitions for functions or data items are usually associated with elements of data storage. A mapfile definition is insufficient to be able to construct this data storage, so these symbols must remain as absolute values. A simple mapfile definition that is associated with a size, but no value results in the creation of data storage. In this case, the symbol definition is accompanied with a section index. However, a mapfile definition that is accompanied with a value results in the creation of an absolute symbol. If a symbol is defined in a shared object, an absolute definition should be avoided. See Augmenting a Symbol Definition.