在可执行文件上使用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
。这意味着什么?
答案 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
表的索引。符号名称后面的数字是索引。
下面介绍如何查找符号的版本字符串:
T
符号.dynsym
部分的第n个条目.gnu.version
部分的第n个条目,获取版本号m .gnu.version_r
部分,查找版本号为m .gnu.version_r
部分中的条目包含相应的版本字符串(对.dynstr
部分的索引引用)符号名称后面的数字是数字m