- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 elf 文件加载到我制作的 MIPS 模拟器中。我遇到的问题是我不太明白 elf 部分标题偏移背后的含义。当我执行段转储时,段 25 - 31 和 33 - 35 在 0x00000000 处“开始”,但标题指出该段从某个值的偏移量(例如 010190)开始。同样在 -S 部分的开头,readelf 指出头在内存中的 0x107b4 处开始。但正如在-S 中所见,最早的内存分配(因为段 0 为空)实际上是在偏移量 010210 处的段 26 中。有人可以解释这里发生了什么吗?我想将所有这些文件静态分配到一个内存数组中。是否有一些关于抵消的假设阻止我这样做?为什么 readelf 说 0x107b4 是 header 起点?
另外,我应该运行 .init
在我将 PC 放在 readelf 指定的“入口点”之前?
编辑:好的,所以,我对可执行文件进行了十六进制转储,现在我意识到偏移量指的是实际 elf 文件中的位置(包含“地址”0 - 11d48 处的元素。)所以我现在的问题是。 .. 如何解决许多内存地址引用地址 0x00000000 的问题?它们当然有不同的偏移量,但现在我知道这是特定于文件的,这意味着有几个部分别名。我真的在内存寻址中使用偏移量吗?
第 25 段:
0x00000000 00474343 3a202847 4e552920 332e342e .GCC: (GNU) 3.4.
0x00000010 35000047 43433a20 ...
Readelf -S
输出:
There are 36 section headers, starting at offset 0x107b4:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 00400134 000134 00000d 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 00400144 000144 000020 00 A 0 0 4
[ 3] .reginfo MIPS_REGINFO 00400164 000164 000018 18 A 0 0 4
[ 4] .dynamic DYNAMIC 0040017c 00017c 000108 08 A 7 0 4
[ 5] .hash HASH 00400284 000284 0000bc 04 A 6 0 4
[ 6] .dynsym DYNSYM 00400340 000340 0001c0 10 A 7 1 4
[ 7] .dynstr STRTAB 00400500 000500 00023c 00 A 0 0 1
[ 8] .gnu.version VERSYM 0040073c 00073c 000038 02 A 6 0 2
[ 9] .gnu.version_r VERNEED 00400774 000774 000060 00 A 7 2 4
[10] .init PROGBITS 004007e4 0007e4 0000a8 00 AX 0 0 4
[11] .text PROGBITS 00400890 000890 000810 00 AX 0 0 16
[12] .MIPS.stubs PROGBITS 004010a0 0010a0 000090 00 AX 0 0 4
[13] .fini PROGBITS 00401130 001130 000058 00 AX 0 0 4
[14] .rodata PROGBITS 00401190 001190 000020 00 A 0 0 16
[15] .eh_frame_hdr PROGBITS 004011b0 0011b0 000034 00 A 0 0 4
[16] .data PROGBITS 10000000 010000 000030 00 WA 0 0 16
[17] .rld_map PROGBITS 10000030 010030 000004 00 WA 0 0 4
[18] .eh_frame PROGBITS 10000034 010034 0000bc 00 WA 0 0 4
[19] .ctors PROGBITS 100000f0 0100f0 00000c 00 WA 0 0 4
[20] .dtors PROGBITS 100000fc 0100fc 000008 00 WA 0 0 4
[21] .jcr PROGBITS 10000104 010104 000004 00 WA 0 0 4
[22] .got PROGBITS 10000110 010110 00007c 04 WAp 0 0 16
[23] .sbss NOBITS 1000018c 010190 000000 00 WAp 0 0 1
[24] .bss NOBITS 10000190 010190 000020 00 WA 0 0 16
[25] .comment PROGBITS 00000000 010190 00007e 00 0 0 1
[26] .debug_aranges MIPS_DWARF 00000000 010210 000058 00 0 0 8
[27] .debug_info MIPS_DWARF 00000000 010268 000146 00 0 0 1
[28] .debug_abbrev MIPS_DWARF 00000000 0103ae 000020 00 0 0 1
[29] .debug_line MIPS_DWARF 00000000 0103ce 0001a6 00 0 0 1
[30] .pdr PROGBITS 00000000 010574 000100 00 0 0 4
[31] .mdebug.abi32 PROGBITS 00000000 010674 000000 00 0 0 1
[32] .rel.dyn REL 004007d4 0007d4 000010 08 A 6 0 4
[33] .shstrtab STRTAB 00000000 010674 00013f 00 0 0 1
[34] .symtab SYMTAB 00000000 010d54 000920 10 35 107 4
[35] .strtab STRTAB 00000000 011674 0006d4 00 0 0 1
最佳答案
当你加载一个 ELF 目标文件时,你应该加载段,而不是段。
加载类型为 PT_LOAD
的段.
地址为 0 的部分是不应加载的部分。如果你看看他们的名字,你可能会猜到原因。
this document将帮助您更好地理解 ELF 格式
关于linker - 解释 readelf -S 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3281698/
我的makefile的一部分看起来像这样...... ifdef vis flg += -framework GLUT -framework OpenGL -Dvis obj += camfun.o
我正在尝试将 MPI 与 D 编程语言结合使用。 D 完全支持 C ABI,可以链接和调用任何 C 代码。我已经完成了显而易见的工作并将 MPI header 翻译为 D。然后我翻译了 a test
我研究了 makefile 项目。我正在使用 gnu gcc 并作为链接器,我使用带有以下参数的 gcc: linkerCmdLine=$(exe) -Wl,--start-group -nostdl
我尝试使用 FMDB 数据库,但出现错误: Undefined symbols for architecture i386: "_OBJC_CLASS_$_FMDatabase", referen
我想知道“本地链接器符号”和“本地程序变量”之间的区别? 我正在读一本书,里面有这样的: alt text http://img682.imageshack.us/img682/9816/symbol
假设我正在使用 clang 构建和链接我的应用程序 clang -I/usr/local/include -c -o app.o main.c clang -L/usr/local/lib -o ap
我正在从程序员的角度阅读计算机系统,关于链接的章节。它解释了如何使用程序 ld 在 linux x86-64 中进行链接。作者声称,为了从可重定位的目标文件构建可执行文件,链接器做了两件事:符号解析和
所以,这是我发现自己想到的任务。假装一下,我有大量的内容。我想查看哪些网站链接到我的内容。我知道我可以研究 TrackBack 或 PingBack,但是那些不使用能够处理这些问题的工具的人呢? 似乎
我认为 动态加载意味着在加载或运行时将库(或任何其他二进制文件)加载到内存中。所以在下面的程序中,当 dlopen() 调用动态加载器时,它会出现,如果库尚未加载,它会将库加载到内存中。 动态链接是指
我想澄清我对共享库的困惑。当我在网上搜索时,我在对静态链接的解释中发现,由于库包含在可执行文件本身中,因此它会导致更大的可执行文件,从而增加程序的内存占用。 而在动态库/共享库的情况下,库是在运行时链
我正在开发一个嵌入式系统(Stellaris Launchpad)并编写一个简单的操作系统(作为一个爱好项目)。使用的工具链是 gcc-none-eabi。 我的下一步是习惯 MPU 以允许内核阻止用
我正在与 JNI 合作。我有一个包装库 (wrapper.so),它使用两个共享库:one.so 和 two.so 一切正常。所有 *.so 都在 lib 文件夹中,在程序文件夹内。 问题是,如果我将
使用通过“node-gyp”传递的链接器命令行选项,我指定了我希望程序链接的库路径和库名称。但是生成的可执行文件没有引用我指定的文件,它在 /usr/lib 中引用了一个不同的名称。 . 我正在使用
我正在为 AWS lambda 开发 native 节点模块。此节点模块需要 json-c 根据 AWS lambda guidelines节点模块不应具有动态依赖关系。所以尝试链接json-c库的静
我想配置一个自动工具化的项目来调用一个非标准的 链接器( gold linker ), 使用 Linux Mint 16/Ubuntu 13.10 的库存自动工具 我相信我会通过以下方式实现这一目标:
要将可执行文件与位于标准位置的库链接,可以在 CmakeLists.txt 文件中执行以下操作: create_executable(generate_mesh generate_mesh.cpp)
链接描述脚本是否可以访问makefile/shell变量并根据所述变量做出决定? 例如,假设我想在不使用其他链接程序脚本的情况下更改下面RAM区域的开始,是否可以使用make变量来执行此操作? MEM
第三方为我提供了一个静态lib(.a)以便与solaris站链接。 我尝试使用sunpro进行编译,但在链接步骤失败。 我想问题出在我使用的编译器(而不是gcc?)或它的版本(由于编译器提供的std
当我们编译代码时,将生成一个目标文件。在链接过程中,从该目标文件生成一个可执行文件。 为什么我们需要一个目标文件?目标文件有什么用?不可能直接生成可执行文件吗?毕竟,我们使用可执行文件来运行该程序。
我知道头文件包含函数和变量的声明,它们在编译期间帮助判断输入的参数是否有效。 所有的库函数都是默认链接的吗? //#include //#include int main() { printf
我是一名优秀的程序员,十分优秀!