The man page http://manpages.ubuntu.com/manpages/xenial/man5/elf.5.html有这样说:
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.
问题是值STT_*
and STB_*
重叠。这是 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
我想我明白STB_*
值为“绑定”和STT+*
是“类型”,但由于值重叠,给定符号表,我如何知道如何解释该字段?
我怎样才能知道如何解释这个字段?
Use ELF{32,64}_ST_BIND
and ELF{32,64}_ST_TYPE
要分割的宏st_info
进入其组件。
Look in /usr/include/elf.h
。你会发现类似的东西:
/* How to extract and insert information held in the st_info field. */
#define ELF32_ST_BIND(val) ...
#define ELF32_ST_TYPE(val) ...
... etc.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)