gpt4 book ai didi

assembly - 如何修改 Erlang 程序集?有可用的资源吗?

转载 作者:行者123 更新时间:2023-12-04 08:28:47 25 4
gpt4 key购买 nike

我怀疑任何人都可以帮助解决这个问题,因为 Erlang's compile documentation 中的以下内容:

Note that the format of assembler files is not documented, and may change between releases - this option is primarily for internal debugging use.



...但以防万一,故事的堆栈跟踪如下:
  • compile:file/2 with ['S'] 生成汇编代码
  • 读取 .S 文件并创建一个 key-value 数据结构,其中 key 是 .S 文件中的“函数”元组,value 是函数的主体,即实现函数的汇编指令。
  • 通过添加程序集来修改数据结构,以便在某些函数中进行外部函数调用。
  • 崩溃...

  • 不幸的是,我只是快速浏览了编译包含以下函数的模块时生成的 .S 文件,其中函数中的第一个表达式被注释掉了:
    spawn_worker(Which) ->
    %syner:sync_pt(),
    case Which of
    ?NAIVE -> spawn(err1, naive_worker_loop, [])
    end.

    当我这样做时,我认为唯一改变的是元组:

    {call_ext,0,{extfunc,syner,sync_pt,0}}.



    ...所以我假设在程序集中注入(inject)函数调用唯一需要的是添加该元组...但是现在我要实际注入(inject)元组...我看到生成的程序集有一些额外说明:

    没有 syner:sync_pt() :
    {function, spawn_worker, 1, 4}.
    {label,3}.
    {func_info,{atom,err1},{atom,spawn_worker},1}.
    {label,4}.
    {test,is_eq_exact,{f,5},[{x,0},{atom,naive}]}.
    {move,{atom,naive_worker_loop},{x,1}}.
    {move,nil,{x,2}}.
    {move,{atom,err1},{x,0}}.
    {call_ext_only,3,{extfunc,erlang,spawn,3}}.
    {label,5}.
    {case_end,{x,0}}.

    syner:sync_pt() :
    {function, spawn_worker, 1, 4}.
    {label,3}.
    {func_info,{atom,err1},{atom,spawn_worker},1}.
    {label,4}.
    {allocate,1,1}.
    {move,{x,0},{y,0}}.
    {call_ext,0,{extfunc,syner,sync_pt,0}}.
    {test,is_eq_exact,{f,5},[{y,0},{atom,naive}]}.
    {move,{atom,naive_worker_loop},{x,1}}.
    {move,nil,{x,2}}.
    {move,{atom,err1},{x,0}}.
    {call_ext_last,3,{extfunc,erlang,spawn,3},1}.
    {label,5}.
    {case_end,{y,0}}.

    我不能仅仅得出结论,添加如下内容:
       {allocate,1,1}.
    {move,{x,0},{y,0}}.
    {call_ext,0,{extfunc,syner,sync_pt,0}}.

    对于我想注入(inject)外部函数调用的每个函数,都可以解决问题。
  • 因为我不确定该汇编代码是否适用于我想要注入(inject)的所有函数(例如是 {allocate,1,1} 总是好的)
  • 因为如果您仔细查看程序集的其余部分,它会略有变化(例如 {call_ext_only,3,{extfunc,erlang,spawn,3}}。 更改为 {call_ext_last, 3,{extfunc,erlang,spawn,3},1}。)。

  • 所以现在的问题是,是否有任何资源可以用来理解和操作由 Erlang 的 compile:file/2 生成的程序集?

    我问这个问题以防万一。我怀疑是否有这方面的资源,因为文档明确指出没有,但我想我没有什么可失去的。即使有,操作汇编代码似乎也比我希望的要复杂。使用 parse_transform/2 肯定更容易,而且我确实设法得到了类似的东西来使用它……只是尝试不同的选择。

    谢谢你的时间。

    最佳答案

    我所知道的唯一使用 beam asm 的工具是 HiPE,https://github.com/erlang/otp/tree/master/lib/hipe/icode 中有很多代码示例等,尽管我不建议对这种格式做太多事情,因为它一直在变化。

    关于assembly - 如何修改 Erlang 程序集?有可用的资源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7935054/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com