【问题标题】:Why I am getting this output when run readelf -s为什么我在运行 readelf -s 时得到这个输出
【发布时间】:2013-02-28 00:42:03
【问题描述】:

我有 Linux 内核并尝试使用 objcopy 工具在其上生成 ELF Header, 下面是第一步

     objcopy -I binary -B i386 -O elf32-i386 --rename-section .data=.text linux_kernel.bin  main.o

在此之后我想使用 readelf -s main.o 读取符号表,但得到奇怪的符号,下面是输出

   Symbol table '.symtab' contains 5 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
 0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
 1: 00000000     0 SECTION LOCAL  DEFAULT    1 
 2: 00000000     0 NOTYPE  GLOBAL DEFAULT    1 _binary_linux_kernel_bin_
 3: 004df650     0 NOTYPE  GLOBAL DEFAULT    1 _binary_linux_kernel_bin_
 4: 004df650     0 NOTYPE  GLOBAL DEFAULT  ABS _binary_linux_kernel_bin_

现在应该可以看到像

这样的符号了
_binary_linux_kernel_bin_start
_binary_linux_kernel_bin__end
_binary_linux_kernel_bin_size

任何机构都可以让我知道我做错了什么吗?还是预期的一个?

为什么我想看到正确的符号,因为必须做类似下面的事情

 --entry_point=_binary_linux_kernel_bin_start

【问题讨论】:

  • 你确定输出没有被截断吗?你试过更大的终端窗口吗?
  • 是的,在这个特定的输出之后,我可以看到整条大线
  • 截断的不是终端。它是readelf

标签: linux-kernel elf objcopy


【解决方案1】:

只是字符串太长,readelf 被截断。试试objdump -x main.o

【讨论】:

  • 'Thanks Bills "objdump -x main.o" 向我展示了 "_binary_linux_kernel_bin_start" 但还想知道 _binary_linux_kernel_bin_start=_start ??
  • 它将是“零”。 objcopy 的工作方式是您可以创建二进制文件并将其放入对象中。 _start 不是内核起始地址。如果您将“main.o”与其他对象链接并创建最终精灵,那么_binary_linux_kernel_bin_start 将是图像中的地址。您不能从二进制文件创建 linux 加载地址。该信息已消失。
【解决方案2】:

您可以使用readelf -W -s main.o 命令,其中-W 告诉readelf 不要将输出截断为80 个字符的宽度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    相关资源
    最近更新 更多