我正在寻找 pyc 文件格式规范。我发现这个链接提供了没有操作码的字节码指令,但我需要更多详细的文件,其中包括.pyc. 谁能给我一个链接?
我正在尝试使用Ruby C API调用简单的ruby函数,当执行编译输出时我得到分段错误,我不确定是什么问题,我希望你能帮助我,谢谢.
C代码(./func.c)
#include <ruby.h>
int main(){
VALUE obj;
VALUE result;
VALUE map;
ruby_init();
rb_require("./func.rb");
obj=rb_str_new_cstr("");
map = rb_hash_new();
rb_hash_aset(map, rb_str_new2("key"),rb_str_new2("val"));
result = rb_funcall(obj, rb_intern("func"), 1, map);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Ruby代码(./func.rb)
def func(opts)
puts opts['key']
end
Run Code Online (Sandbox Code Playgroud)
编译标志
gcc func.c -o func -I/home/wh/.rbenv/versions/2.1.6/include/ruby-2.1.0/x86_64-linux -I/home/wh/.rbenv/versions/2.1.6/include/ruby-2.1.0 -L/home/wh/.rbenv/versions/2.1.6/lib/ -lruby-static -lm -pthread -lcrypt -ldl -rdynamic
Run Code Online (Sandbox Code Playgroud)
运行./func时出现分段错误
<main>: [BUG] Segmentation fault at 0x00000000000018
ruby 2.1.6p336 (2015-04-13 revision 50298) [x86_64-linux]
-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0002 E:002468 TOP [FINISH]
-- C level backtrace information …Run Code Online (Sandbox Code Playgroud) 使用给定的字节码,当遇到switch指令时,我想知道下一条指令的位置(不运行代码).为了做到这一点,我想我应该计算指令的总大小,包括跳转偏移或匹配偏移对.这可能吗?如果不是,怎么可能知道下一条指令在哪里?
此外,还有其他任何具有动态大小的字节码指令(它们的大小基于变量)吗?
tableswitch
<0-3 byte pad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
lowbyte1
lowbyte2
lowbyte3
lowbyte4
highbyte1
highbyte2
highbyte3
highbyte4
jump offsets...
Run Code Online (Sandbox Code Playgroud)
lookupswitch
<0-3 byte pad>
defaultbyte1
defaultbyte2
defaultbyte3
defaultbyte4
npairs1
npairs2
npairs3
npairs4
match-offset pairs...
Run Code Online (Sandbox Code Playgroud) 我试图了解调用python函数的过程,我创建.pyc了调用的简单文件os.listdir('.'),我看到os并listdir保存在co_names表中,执行CALL_FUNCTION字节码指令时,如何os识别库?是根据它的名字使用co_names表吗?python 是否开始搜索名为 的模块os.pyc?如果是这样,python 如何知道.pyc模块中调用的函数的字节码的偏移量在哪里?
谢谢。
dis 模块字节码片段
5 28 LOAD_NAME 0 (os)
31 LOAD_ATTR 2 (listdir)
34 LOAD_CONST 3 ('.')
37 CALL_FUNCTION 1
Run Code Online (Sandbox Code Playgroud)