Инструкции байт-кода луча

Привет, ребята, у меня есть вопрос о передаче байт-кода формата файла.

Что такое {label,1} и {line,1} для инструкций?

И есть ли у кого-нибудь хороший веб-сайт/лист, где я могу прочитать о файлах реверсивного луча?

Спасибо


person QDA    schedule 02.07.2016    source источник


Ответы (1)


Из compile документации модуля Erlang:

Обратите внимание, что формат файлов ассемблера не документирован и может меняться между выпусками.

Тем не менее, инструкция label отмечает местоположение для целей ветвления и вызова, а инструкция line предоставляет информацию о местоположении источника и номере строки.

Вы можете изучить документацию по абстрактному формату.

person Steve Vinoski    schedule 02.07.2016
comment
Окей, спасибо. Другой вопрос: есть ли у вас идея, как я могу преобразовать байт-код в файл .beam или как-то запустить обработанный байт-код? - person QDA; 02.07.2016
comment
@QDA: вы спрашиваете, как скомпилировать ассемблер в луч? Просто сохраните ассемблерный код в файле .S и используйте erlc, чтобы скомпилировать его в файл .beam. - person Steve Vinoski; 02.07.2016
comment
Да, точно. Я декомпилировал файл луча с помощью файла:write_file(/tmp/my_beamfile_disasm, io_lib:fwrite(~p.\n, [beam_disasm:file(my_beamfile)])). После этого я попробовал то, что вы сказали: erlc my_beamfile_disasm.S, но получил ошибку. Причина сбоя, которую выводит erlc: причина сбоя: badarg. Что я делаю неправильно? - person QDA; 02.07.2016
comment
Это не сработает, поскольку beam_disasm:file/1 возвращает запись #beam_file, содержащую имя модуля, экспорт, атрибуты, информацию о компиляции и код, и эта запись не соответствует формату файла .S. Вместо этого вы можете взглянуть на beam_lib и узнать, как извлечь абстрактный формат из луча файл. - person Steve Vinoski; 02.07.2016
comment
Нужна ли мне отладочная информация, чтобы использовать beam_lib для получения файла .S? - person QDA; 02.07.2016
comment
Да, вам нужна информация об отладке, чтобы гарантировать, что файл луча имеет фрагмент абстрактного кода. В общем, я не уверен, чего вы на самом деле пытаетесь достичь, поэтому трудно дать вам совет, но я упомянул абстрактный формат, потому что он задокументирован и им легче программно манипулировать, чем ассемблером. - person Steve Vinoski; 02.07.2016
comment
У меня нет отладочной информации :/ Ну, у меня есть файл .beam, из которого мне нужно извлечь ключевое слово. (В качестве упражнения) Если я декомпилирую файл, как я написал выше, я могу увидеть строки, которые печатает программа, а также некоторые другие строки, которые я не знаю, как они используются. Поэтому я хотел изменить какой-то байт-код, чтобы проверить, как программа отреагирует на него. - person QDA; 02.07.2016
comment
Вы можете попробовать {beam_file,Mod,Exp,Attr,Info,Code} = beam_disasm:file("yourfile.beam")., а затем beam_listing:module(user, {Mod,Exp,Attr,Code,NumLabels})., где NumLabels — это количество меток, найденных в Code. Это напечатает модуль в формате .S в поток user. Вы можете подсчитать метки, используя что-то вроде этой функции: lc([], Acc) -> Acc; lc(label,Acc) -> Acc+1; lc([H|T],Acc) -> lc(T, lc(H,Acc)); lc(Tuple, Acc) when is_tuple(Tuple) -> lists:foldl(fun(X,A) -> lc(X,A) end, Acc, tuple_to_list(Tuple)); lc(_,Acc) -> Acc. Вызовите это так: NumLabels = lc(Code,0). - person Steve Vinoski; 02.07.2016
comment
Эй, извините, что беспокою вас снова, но если я скопирую вашу функцию подсчета меток в erl, я получу сообщение об ошибке: * 1: синтаксическая ошибка перед: '->'. - person QDA; 03.07.2016
comment
Это должно быть скомпилированной функцией. Для erl это будет: Count = fun Count([], Acc) -> Acc; Count(label,Acc) -> Acc+1; Count([H|T],Acc) -> Count(T, Count(H,Acc)); Count(Tuple, Acc) when is_tuple(Tuple) -> lists:foldl(fun(X,A) -> Count(X,A) end, Acc, tuple_to_list(Tuple)); Count(_,Acc) -> Acc end. Для вызова: NumLabels = Count(Code,0). - person Steve Vinoski; 03.07.2016