V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
menyakun
V2EX  ›  程序员

ARM64 汇编中有关 jump table 的问题

  •  
  •   menyakun · 2021-04-05 23:28:45 +08:00 · 2307 次点击
    这是一个创建于 1345 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我知道了 jump table 的地址,从 rodata 中 dump 出了对应的数据,但不知道 jump table 中的数据是按照什么格式组织的

    表的一行是 4 个字节,所以"fffe90d4", "fffe9124"这些值代表了地址的 offset ?但这些值也太大了吧,这个函数没这么多行。

    我查了老半天,也没有查到相关的资料,求懂汇编的老哥帮忙看看。

    objdump.png

    第 1 条附言  ·  2021-04-06 13:14:41 +08:00

    使用这个jump table的汇编指令如下所示:

    457c0:  f00000a9    adrp    x9, 5c000
    457c4:  911c0129    add     x9, x9, #0x700
    457c8:  b8a87928    ldrsw   x8, [x9, x8, lsl #2]
    457cc:  8b090108    add     x8, x8, x9
    457d0:  d61f0100    br      x8
    
    第 2 条附言  ·  2021-04-06 13:36:33 +08:00
    解决了,这些值代表的是相对于 jump table 基址的偏移,见这个回答 https://stackoverflow.com/a/52192789/9797889
    6 条回复    2021-04-06 06:31:13 +08:00
    Nerv
        1
    Nerv  
       2021-04-05 23:40:13 +08:00 via Android
    只试过用 readelf 读取 linux x86-64 elf 文件的 symtable,不知道对应的 arm 版本有没有这种功能。
    menyakun
        2
    menyakun  
    OP
       2021-04-05 23:42:24 +08:00
    @Nerv 这个 jump table 是一个 switch-case 生成的,所以对应的目标地址没有记录在 symtable 里面
    wezzard
        3
    wezzard  
       2021-04-05 23:49:52 +08:00   ❤️ 1
    這裡存儲的是一個相對偏移量,應該看成一個有符號的整數。你應該用該條記錄的基址加上這個有符號的相對偏移,然後得出跳轉目標地址。
    akira
        4
    akira  
       2021-04-06 01:52:48 +08:00
    看到 feff 就觉得应该是 -100
    levelworm
        5
    levelworm  
       2021-04-06 02:27:34 +08:00 via Android
    看到 ff 打头的我第一反应是 sign extended,具体得去查查。。。
    zk8802
        6
    zk8802  
       2021-04-06 06:31:13 +08:00
    Jump table 中常见的地址 /偏移编码方式有好几种。你需要看一下对应的汇编指令是如何解析这个 jump table 的。

    另外你这里面的负数大概率是相对 PC 的偏移。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 11:46 · PVG 19:46 · LAX 03:46 · JFK 06:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.