The man page has this to say:
st_info This member specifies the symbol's type and binding
attributes:
STT_NOTYPE The symbol's type is not defined.
STT_OBJECT The symbol is associated with a data object.
STT_FUNC The symbol is associated with a function or other
executable code.
STT_SECTION The symbol is associated with a section. Symbol
table entries of this type exist primarily for
relocation and normally have STB_LOCAL bindings.
STT_FILE By convention, the symbol's name gives the name
of the source file associated with the object
file. A file symbol has STB_LOCAL bindings, its
section index is SHN_ABS, and it precedes the
other STB_LOCAL symbols of the file, if it is
present.
STT_LOPROC This value up to and including STT_HIPROC is
reserved for processor-specific semantics.
STT_HIPROC This value down to and including STT_LOPROC is
reserved for processor-specific semantics.
STB_LOCAL Local symbols are not visible outside the object
file containing their definition. Local symbols
of the same name may exist in multiple files
without interfering with each other.
STB_GLOBAL Global symbols are visible to all object files
being combined. One file's definition of a
global symbol will satisfy another file's
undefined reference to the same symbol.
STB_WEAK Weak symbols resemble global symbols, but their
definitions have lower precedence.
STB_LOPROC This value up to and including STB_HIPROC is
reserved for processor-specific semantics.
STB_HIPROC This value down to and including STB_LOPROC is
reserved for processor-specific semantics.
There are macros for packing and unpacking the
binding and type fields:
ELF32_ST_BIND(info) or ELF64_ST_BIND(info)
extract a binding from an st_info value.
ELF32_ST_TYPE(info) or ELF64_ST_TYPE(info)
extract a type from an st_info value.
ELF32_ST_INFO(bind, type) or ELF64_ST_INFO(bind,
type)
convert a binding and a type into an st_info
value.
The problem is that the values for STT_*
and STB_*
overlap. This is the declaration of those values in uapi/linux/elf.h:
#define STB_LOCAL 0
#define STB_GLOBAL 1
#define STB_WEAK 2
#define STT_NOTYPE 0
#define STT_OBJECT 1
#define STT_FUNC 2
#define STT_SECTION 3
#define STT_FILE 4
#define STT_COMMON 5
#define STT_TLS 6
I think I understand that the STB_*
values are 'Bindings' and STT+*
are 'Types', but since the values overlap, given a symbol table, how can I tell how to interpret this field?
Use
ELF{32,64}_ST_BIND
andELF{32,64}_ST_TYPE
macros to splitst_info
into its components.Look in
/usr/include/elf.h
. You'll find something like: