ELF symbols
Symbols are a symbolic reference to some type of data or code such as a global variable or function. For instance, the printf()
function is going to have a symbol entry that points to it in the dynamic symbol table .dynsym
. In most shared libraries and dynamically linked executables, there exist two symbol tables. In the readelf -S
output shown previously, you can see two sections: .dynsym
and .symtab
.
The .dynsym
contains global symbols that reference symbols from an external source, such as libc
functions like printf
, whereas the symbols contained in .symtab
will contain all of the symbols in .dynsym
, as well as the local symbols for the executable, such as global variables, or local functions that you have defined in your code. So .symtab
contains all of the symbols, whereas .dynsym
contains just the dynamic/global symbols.
So the question is: Why have two symbol tables if .symtab
already contains everything that's in .dynsym
? If you check out the readelf -S
output of...