【问题标题】:How to interpret the st_info field of elf symbol table section如何解释elf符号表部分的st_info字段
【发布时间】:2026-01-03 01:55:02
【问题描述】:

man page 有话要说:

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_*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+* 是“类型”,但是由于值重叠,给定一个符号表,我怎么知道如何解释这个字段?

【问题讨论】:

    标签: elf symbol-table


    【解决方案1】:

    我怎么知道如何解释这个字段?

    使用ELF{32,64}_ST_BINDELF{32,64}_ST_TYPE 宏将st_info 拆分为其组件。

    查看/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.
    

    【讨论】:

    • 感谢您的回答,但我仍然感到困惑。假设st_info 的值为2。这是指STB_WEAK 还是指STT_FUNC
    • 哦。我想我明白了。 #define ELF_ST_BIND(x) ((x) >> 4) #define ELF_ST_TYPE(x) (((unsigned int) x) & 0xf) 表示如果st_info == 34 则表示STB_WEAK STT_FUNC 因为34 >> 4 == 234 & 0xff == 2。对吗?
    • @Stephen 正确(但您永远不需要考虑 34 ——只需将 readelf -Ws 的输出与 STB_WEAK == ELF_ST_BIND(sym->st_info) 进行比较。
    • 知道了。我正在用 python 编写一个 ELF 解析器,这个值很混乱。
    最近更新 更多