mini-notes-issue-16/

Темы выпуска: автоматическая генерация функции UPSERT в PostgreSQL, почему при работе с деньгами нужно использовать рациональные числа, настройка всплывающих сообщений в Claws Mail и не только. Предыдущие выпуски мини заметок: пятнадцатый , четырнадцатый , тринадцатый , двенадцатый .

1. Русская раскладка в Microsoft Windows 2000

В честь попыток вспомнить WinAPI я тут игрался под VirtualBox c Windows 2000. Оказывается, чтобы под Win2k включить русскую раскладку, нужно зайти в Control Panel, открыть Regional Options, в списке Language settings for the system поставить галочку Cyrillic. Винда запросит установочный диск. После выполнения этих шагов в настройках клавиатуры можно будет выбрать русскую раскладку.

2. Сборка минимального exe-шника с помощью MinGW

Тут основная проблема состоит в том, что при компиляции кода на Си добавляется вызов процедуры __main и, похоже, нет флага, позволяющего отключить это поведение. В результате приходится делать как-то так:

$ export MINGW=/usr/libexec/gcc/i586-mingw32msvc/4.2.1-sjlj/
$ $MINGW/cc1 -DUNICODE test.c -o /tmp/test0.s
$ cat /tmp/test0.s | grep -v ___main > /tmp/test.s
$ /usr/i586-mingw32msvc/bin/as /tmp/test.s -o /tmp/test.o
$ $MINGW/collect2 /tmp/test.o -luser32 -lkernel32 -s -o test.exe

Транслируем код на Си в ассемблерный код, grep-ом выпиливаем вызов ___main, затем компилируем ассемблерный код и линкуем все хозяйство в исполняемый файл.

3. Как декомпилировать beam в код на Erlang?

Знаете ли вы, что если эрланговый модуль был собран с флагом debug_info, то можно полностью восстановить его исходный код за исключением разве что комментариев?

Рассмотрим такой модуль:

module ( test ) .

export ( [ test_func / 1 ] ) .

% test comment
test_func ( Name ) ->
«Hello, » ++ Name ++ «!» .

Скомпилируем его с флагом debug_info:

erlc +debug_info test.erl

А теперь получим AST кода , используя только beam:

1> rp(beam_lib:chunks(«test.beam», [abstract_code])).
{ok,{test,[{abstract_code,{raw_abstract_v1,[{attribute,1,file,{«test.erl»,1}},{attribute,1,module,test},{attribute,3,export,[{test_func,1}]},{function,6,test_func,1,[{clause,6,[{var,6,’Name’}],[],[{op,7,’++’,{string,7,»Hello, «},{op,7,’++’,{var,7,’Name’},{string,7,»!»}}}]}]},{eof,8}]}}]}}

При желании не представляет большого труда написать программу, получающую исходный код из этого AST. Но, к счастью, за нас уже все написано:

2> {ok, {_, [{abstract_code, {_, [_|Abs]}}]}} =
2>   beam_lib:chunks(«test.beam», [abstract_code]), ok.
ok
3> Src = erl_prettypr:format(erl_syntax:form_list(Abs)).
«-module(test).nn-export([test_func/1]).nntest_func(Name) -> «Hello»» ++ Name ++ «»!»».nn»»
4> file:write_file(«»test_src.erl»»Src).
ok

Если теперь посмотреть test_src.erlвы обнаружите

EnglishRussianUkrainian