括号中的数字在readelf输出中意味着什么?

时间:2017-10-14 11:55:12

标签: linux readelf

在可执行文件上使用readelf时,我在一些符号名称后的括号中得到一个数字。例如:

package com.home.interview;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class RemoveInReadFile {

    public static void main(String[] args) {

        try {
            Scanner scanner = new Scanner(new File("Readme.txt"));


            while(scanner.hasNext())
            {
                String line = scanner.next();

                String lineAfterTrim = line.trim();
                System.out.print(lineAfterTrim);
            }


        } 

        catch (FileNotFoundException e) {

            e.printStackTrace();
        }

    }

}

在这种情况下,stderr的符号名后面有一个mysql> SELECT User FROM mysql.user; +------+ | User | +------+ | root | | root | | | | root | | | | root | +------+ 6 rows in set (0.00 sec) mysql> CREATE USER 'dummy'@'localhost'; ERROR 1805 (HY000): Column count of mysql.user is wrong. Expected 45, found 48. The table is probably corrupted 。这意味着什么?

1 个答案:

答案 0 :(得分:4)

它是版本符号,其中@GLIBC_2.2.5来自。

该数字引用.gnu.version_r部分

的条目

ELF符号版本控制是ELF的GNU扩展。使用版本解析符号时,如果目标符号也有版本,则版本必须匹配,或者符号可以解析。

为了保持兼容性,版本不会存储在.dynsym部分中。相反,它存储在.gnu.version部分内。

.gnu.version.dynsym部分具有完全相同的条目数,每个条目存储相应的符号版本(0表示无版本要求)。

version是一个字符串,.gnu.version存储一个引用.gnu.version_r表的索引。符号名称后面的数字是索引。

下面介绍如何查找符号的版本字符串:

  1. 假设解析T符号
  2. 该符号位于.dynsym部分的第n个条目
  3. 查看.gnu.version部分的第n个条目,获取版本号m
  4. 遍历.gnu.version_r部分,查找版本号为m
  5. 的条目
  6. .gnu.version_r部分中的条目包含相应的版本字符串(对.dynstr部分的索引引用)
  7. 符号名称后面的数字是数字m