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.