标签: opcode

处理ELF重定位 - 了解重定位,符号,节数据以及它们如何协同工作

TL; DR

我试图将这个问题作为一个简短的问题,但这是一个复杂的问题所以它最终会变长.如果您可以回答这方面的任何部分或提供任何建议或提示或资源或任何内容,那将非常有帮助(即使您没有直接解决我的所有问题).我现在正撞在墙上.:)

以下是我遇到的具体问题.请阅读下面的更多信息.

  • 我正在寻找有关如何处理重定位条目和更新节数据中未解析的符号的指导.我根本不明白如何处理我从重定位和部分等中提取的所有信息.
  • 我也希望了解链接器遇到重定位时发生了什么.试图正确实现重定位方程并以正确的方式使用所有正确的值是非常具有挑战性的.
  • 当我遇到操作码,地址和符号等时,我需要了解如何处理它们.我觉得我错过了一些步骤.
  • 我觉得我没有很好地掌握符号表条目如何与重定位进行交互.我应该如何使用符号的绑定,可见性,值和大小信息?
  • 最后,当我使用已解析的数据和可执行文件使用的新重定位条目输出我的文件时,数据都是不正确的.我不确定如何遵循所有重新安置并提供所需的所有信息.可执行文件对我有什么期望?

到目前为止我的方法

我正在尝试以特定的[未记录的]专有格式创建一个重定位文件,该格式主要基于ELF.我编写了一个工具,它接受一个ELF文件和一个部分链接文件(PLF)并处理它们以输出完全解析的rel文件.此rel文件用于根据需要加载/卸载数据以节省内存.该平台是一个32位PPC.一个问题是该工具是用c#编写的,但数据是针对PPC的,因此需要注意有趣的endian问题等.

我一直试图了解在用于解析未解析的符号等时如何处理重定位.到目前为止我所做的是从PLF复制相关部分,然后对于每个相应的.rela部分,我解析条目并尝试修复部分数据并根据需要生成新的重定位条目.但这就是我的困难所在.我离开了我的元素,这种事情似乎通常是由链接器和加载器完成的,所以没有很多好的例子可以借鉴.但是我发现了一些有帮助的东西,包括这一个.

所以发生的事情是:

  1. 从PLF复制部分数据以用于rel文件.我只对.init(无数据),.text,.ctors,.dtors,.rodata,.data,.bss(无数据)和我们正在使用的另一个自定义部分感兴趣.
  2. 迭代PLF中的.rela部分并读入Elf32_Rela条目.
  3. 对于每个条目,我提取r_offset,r_info和r_addend字段,并从r_info(符号和reloc类型)中提取相关信息.
  4. 从PLF的符号表中,我可以得到symbolOffset,symbolSection和symbolValue.
  5. 从ELF,我得到symbolSection的加载地址.
  6. 我计算int localAddress =(.relaSection.Offset + r_offset).
  7. 我从r_offset的symbolSection的内容中获取了uint relocValue.
  8. 现在我拥有了我需要的所有信息,因此我对reloc类型进行了切换并处理数据.这些是我支持的类型:
    R_PPC_NONE
    R_PPC_ADDR32
    R_PPC_ADDR24
    R_PPC_ADDR16
    R_PPC_ADDR16_LO
    R_PPC_ADDR16_HI
    R_PPC_ADDR16_HA
    R_PPC_ADDR14
    R_PPC_ADDR14_BRTAKEN
    R_PPC_ADDR14_BRNTAKEN
    R_PPC_REL24
    R_PPC_REL14
    R_PPC_REL14_BRTAKEN
    R_PPC_REL14_BRNTAKEN
  9. 怎么办??我需要更新节数据并构建随播重定位条目.但我不明白该做什么以及如何做.

我这样做的全部原因是因为有一个旧的过时不支持的工具不支持使用自定义部分,这是该项目的关键要求(出于内存原因).我们有一个自定义部分,其中包含一堆我们想要在启动后卸载的初始化代码(总计大约一兆).现有工具只是忽略该部分中的所有数据.

因此,虽然制作支持自定义部分的自己的工具是理想的,但如果有任何明智的想法以实现这一目标的另一种方式,我全都耳朵!我们已经提出了将.dtor部分用于我们的数据的想法,因为它几乎是空的.但这很麻烦,如果它阻止干净关闭,可能无论如何都无法工作.


重定位加示例代码

当我处理搬迁,我工作过的公式和信息在ABI文档中发现的HERE(约4.13节,第80ish),以及一些我已经挖出了其他代码示例和博客文章.但是这一切都让人感到困惑,并没有真正拼写出来,而且我发现的所有代码都有所不同.

例如,

  • R_PPC_ADDR16_LO - > half16:#lo(S + A)
  • R_PPC_ADDR14_BRTAKEN - > low14*:( S + A)>> 2
  • 等等

所以,当我看到这种代码时,我该如何解读呢?

这是一个例子(来自这个来源)

case ELF::R_PPC64_ADDR14 : {
    assert(((Value + Addend) & 3) == 0); …
Run Code Online (Sandbox Code Playgroud)

reverse-engineering elf opcode relocation symbol-table

18
推荐指数
1
解决办法
7029
查看次数

优化APC缓存

这是我的APC如何运行的链接:[已删除]

正如你所看到的,它很快就会填满,我的Cache Full Count有时会超过1000

我的网站使用Wordpress.

我注意到,每次我发布新帖子或编辑帖子时,都会发生两件事.

1)APC内存"USED"重置2)我得到了很多碎片

我试过给APC提供更多的内存(512 mb),但有时会崩溃,看来384是最好的.我还有一个Cron作业,每4小时重新启动一次apache,清除所有APC片段并使用内存.再说一次,如果APC运行了很长一段时间,我的apache会崩溃,我认为由于片段的堆积.

我应该使用apc.Filters并过滤掉一些不应该缓存的东西吗?

我真的很喜欢这种东西,所以如果有人可以用完整的说明解释,非常感谢你!

wordpress opcode-cache apc opcode fragment-caching

17
推荐指数
2
解决办法
2万
查看次数

堆栈是CPU还是RAM?

我有一些关于堆栈的问题.

  1. 堆栈是CPU还是RAM?
  2. 堆栈是运行OPcode的地方吗?
  3. EIP是CPU还是RAM?

memory cpu stack opcode eip

17
推荐指数
3
解决办法
1万
查看次数

从C执行二进制机器代码

按照这个说明,我设法只产生528字节的大小a.out(当gcc main.c最初给我8539字节的大文件时).

main.c是:

int main(int argc, char** argv) {

    return 42;
}
Run Code Online (Sandbox Code Playgroud)

但我已经从这个汇编文件中构建了一个a.out:

电源:

; tiny.asm
  BITS 64
  GLOBAL _start
  SECTION .text
  _start:
                mov     eax, 1
                mov     ebx, 42  
                int     0x80
Run Code Online (Sandbox Code Playgroud)

有:

me@comp# nasm -f elf64 tiny.s
me@comp# gcc -Wall -s -nostartfiles -nostdlib tiny.o
me@comp# ./a.out ; echo $?
42
me@comp# wc -c a.out
528 a.out
Run Code Online (Sandbox Code Playgroud)

因为我需要机器码:

objdump -d a.out

a.out:     file format elf64-x86-64


Disassembly of section .text:

00000000004000e0 <.text>:
  4000e0:   b8 01 00 00 00          mov    $0x1,%eax …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc nasm opcode

16
推荐指数
1
解决办法
8535
查看次数

如何阅读英特尔操作码表示法

我正在阅读一些关于英特尔操作码汇编指令的资料,但我无法理解它遵循操作码字节是什么意思.例如:"cw","cd","/ 2","cp","/ 3".请给我一个提示是什么意思或在哪里可以找到完整的参考?提前致谢!

E8 cw CALL rel16相对于下一条指令调用near,relative,displacement

E8 cd CALL rel32相对于下一条指令调用near,relative,displacement

FF / 2 CALL r/m16调用r/m16中给出的接近绝对间接地址

FF / 2 CALL r/m32调用r/m32中给出的接近绝对间接地址

9A cd CALL ptr16:16调用操作数中给出的far,absolute,address

9A cp CALL ptr16:32调用操作数中给出的far,absolute,address

FF / 3 CALL m16:16调用m16:16中给出的远,绝对间接地址

FF / 3 CALL m16:32调用m16:32中给出的远,绝对间接地址

x86 assembly intel machine-code opcode

15
推荐指数
3
解决办法
4909
查看次数

[ebp*2]是否引用DS或SS段?

IDM表示,如果EBP用作基址寄存器,则内存操作使用SS段.其结果是,[ebp + esi][esi + ebp]引用SS和DS的段,分别.参见NASM的文档:3.3有效地址.

另外,在上述相同的部分,NASM提到如何通过替换以产生更短的机器代码[eax*2][eax+eax].

然而,NASM还生成[ebp + ebp]用于[ebp*2](即没有碱寄存器).

我怀疑[ebp+ebp]引用SS段,并[ebp*2]引用DS段.

我问NASM这个问题.他们思考[ebp*2]并且[ebp+ebp]是一样的,但对我来说没有意义.显然,[ebp+ebp](ebp作为基址寄存器)引用SS段.如果它们相同,也[ebp*2必须参考SS.这意味着SS只要ebp是基数或索引寄存器就被引用,这又意味着SS [ebp + esi][esi + ebp]引用SS段,因此它们必须相同.

有谁知道哪个部分[ebp*2]使用?

x86 assembly nasm opcode instructions

14
推荐指数
1
解决办法
383
查看次数

未处理的矮人表达

任何人都可以告诉我下面的分段错误究竟意味着什么?

Unhandled dwarf expression opcode 0x93
Run Code Online (Sandbox Code Playgroud)

它在solaris 10 i386上.

任何建议表示赞赏

opcode

13
推荐指数
2
解决办法
1万
查看次数

在CLR 4.0中引入了哪些OpCodes?

与3.5相比,.NET 4.0中是否有新的IL操作码,如果有的话,我在哪里可以找到它们的列表?

.net clr il cil opcode

13
推荐指数
1
解决办法
751
查看次数

为什么$ x = 5; $ X +++ $ X ++; 在PHP中等于11?

根据操作码它应该是12.我错了吗?

number of ops:  8
compiled vars:  !0 = $x
line    #* E I O op                  fetch      ext   return  operands
-------------------------------------------------------------------------
  3     0  E >   EXT_STMT                                                 
        1        ASSIGN                                         !0, 5
  5     2        EXT_STMT                                                 
        3        POST_INC                               ~2      !0
        4        POST_INC                               ~3      !0
        5        ADD                                    ~4      ~2, ~3
        6        ECHO                                           ~4
  7     7      > RETURN                                         1

branch: #  0; line:     3-    7; sop:     0; eop:     7; out1:  -2
path #1: 0,
Run Code Online (Sandbox Code Playgroud)

编辑

另外($ x ++)+($ x ++); 返回相同的结果(11).实际上,这是问题和操作码调查的主要原因.

php opcode

13
推荐指数
1
解决办法
493
查看次数

如何手动解释操作码?

77f4bcbc 8945fc          mov     dword ptr [ebp-4],eax
Run Code Online (Sandbox Code Playgroud)

这是规则:

88  /r   MOV r/m8,r8       2/2           Move byte register to r/m byte
89  /r   MOV r/m16,r16     2/2           Move word register to r/m word
89  /r   MOV r/m32,r32     2/2           Move dword register to r/m dword
Run Code Online (Sandbox Code Playgroud)

如何解释8945fcmov dword ptr [ebp-4],eax

assembly opcode

12
推荐指数
1
解决办法
1万
查看次数