|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Ноя 3, 2003 02:02:22 Правка bsl_zcs Такой большой, а в сказки веришь. Ага! Поверил, да так, что уже вторую неделю за Perl-ом сижу, изучал ускоренным темпом. volodya Смотреть на codeproject.com Ух, сколько там всего! Только вот чтоБрать и конвертить? Но всё равно, спасибо! |
|
|
Дата: Ноя 3, 2003 22:02:31 2 IceStudent: уже вторую неделю за Perl-ом сижу Ну, это завсегда полезно. Хотя бы для того, чтобы чётко представлять границы применимости инструментов. ;) Посмотрел я C::Scan. В принципе, после лёгкой обработки напильником, видимо, обусловленной отсутствием у меня потребного ему сишного препроцессора, он оказался вполне работоспособным. Не стоит только снова проявлять такую наивность и ожидать того, что он разберёт буквально всё. ;) Чего-нибудь наверняка не сможет. В простейшем случае, вызывается так: use C::Scan; $c = new C::Scan 'filename' => 'tst.c'; После чего, методом get из него извлекается куча разных результатов вскрытия. ;) Например, $c->get('parsed_fdecls') - список распарсеных определений функций, и так далее. В общем, вот такой тестовый исходник: #define ZTST1 1
#define ZTST2(x) 1*(x)
extern void zexit();
typedef struct { int a,b; float f; } TESTSTRUCT;
float func2(
int a,
float b
)
{
a=b;
return 0.0;
}
void main(int argc, char *argv[])
{
zexit();
} он разбирает на запчасти следующим образом:
Дефайны без параметров - $c->get('defines_no_args'):
("ZTST1", 1)
С параметрами - $c->get('defines_args'):
("ZTST2", [["x"], "1*(x)"])
Тайпдефы - $c->get('typedef_hash'):
{ TESTSTRUCT => [" struct { int a,b; float f; } ", ""] }
Распарсеная структура этого тайпдефа - ${$c->get('typedef_structs')}{'TESTSTRUCT'}:
[
["int", undef, "a"],
["int", undef, "b"],
["float", undef, "f"],
]
Распарсеные определения функций - $c->get('parsed_fdecls'):
[
["void", "zexit", [], "void zexit()", undef],
[
"float",
"func2",
[
["int", "a", undef, "int a", ""],
["float", "b", undef, "float b", ""],
],
"float func2(\n int a,\n float b\n)",
undef,
],
[
"void",
"main",
[
["int", "argc", undef, "int argc", ""],
["char *", "argv", undef, "char *argv[]", "[]"],
],
"void main(int argc, char *argv[])",
undef,
],
]
Как видишь, многое, если не практически всё, из того что нужно, из него добывается нахаляву. Слепить из этого что-нибудь в формате твоего ассемблера не должно быть слишком сложно. Правда, когда он чего-нибудь не сожрёт, тебе будет проще исправить оригинал до понимаемого им вида, чем разбирать и править его исходник под тысячу строк. ;) Хотя, скорее всего, руками придётся работать в любом случае, какой навороченый парсер бы ни был... Скормил ему на пробу winuser.h - дык, он его героически распарсил, правда в двух или трёх местах на что-то ругался. В общем, с этим уже сам будешь разбираться. Если вообще на это заморочишься, конечно... ;) А вообще, там граблей разложен не один квадратный километр. Например, я себе слабо представляю, что ты будешь делать со всякими #pragma pack-ами и иже с ними... Видимо, для некоторых вещей действительно лучше воспользоваться советом Four-F-а. 2 volodya: Дык, я, вроде, и не уходил никуда. ;) Времени, правда, не хватает ни на что, поэтому пишу очень редко. Как по твоему, на этот раз я никого не пнул ненароком? ;) Брать и конвертить Если бы всё было так просто. Заморочек везде хватает, и полностью автоматически конвертировать, боюсь, в любом случае, не получится. Главное - определиться до какой степени имеет смысл это всё автоматизировать. Потому, что на реализацию поддержки пяти процентов редких случаев уйдёт девяносто пять процентов общих усилий. Впрочем, как и всегда. ;) |
|
|
Дата: Ноя 4, 2003 07:52:36 Правка отсутствием у меня потребного ему сишного препроцессора А в ActivePerl он есть? Не стоит только снова проявлять такую наивность Да, нет, я и не проявляю. Я потому и справшивал прогу с исходниками, чтобы если что, поправить. А то, что всё равно руками доделывать, то это нормально. Ведь не всё же вручную делать, а только часть, это уже хорошо! что ты будешь делать со всякими #pragma pack-ами Они меня не заботят пока. Спасибо за помощь всем, кто откликнулся! |
|
|
Дата: Ноя 5, 2003 00:37:07 Правка И вот ещё: Почему не запускается C::Scan? Он требует отсутствующий модуль (Data::Flow), да и говорит, что метода new у него нет. А я просто запускал тестовый скрипт из пакета C::Scan... |
|
|
Дата: Ноя 7, 2003 20:01:47 Прошу прощения за задержку с ответом - в командировке был. Не запускается он по той простой причине, что ему действительно необходим этот модуль. :) Скачай ещё и этот Data::Flow, больше он, вроде бы, ничего не хочет. Или, как вариант, ставь модули с ppm-а. Он автоматом завсимости отрезолвит. Дальше, в ActiveState-овском дистрибутиве Перла сишного препроцессора нет. Он, по смыслу, должен быть в дистрибутиве какого-нибудь сишного компилятора. Скрипт просто вызывает штатный сишный препроцессор для того, чтобы не возиться со всякими #ifdef-ами и прочим. Под юниксами на самом деле вызывается gcc -E, если я ничего не путаю. Под виндами тебе, наверное, будет проще прогнать исходник препроцессором самому, каким-нить Инвижуал Це, а скрипт запатчить, чтобы он просто из файла читал. В том верианте, что у меня, для этого надо строчки (open($sym, $cmd) or die "Cannot open pipe from `$cmd': $!")
and bless $sym => $class;
заменить, например, на open ($f, $filename);
$f;
В принципе, после этого, оно уже может выдавать то, что я сюда постил. Не знаю, есть ли в том пакете тестовый скрипт, я на него не смотрел. |
|
|
Дата: Ноя 12, 2003 15:02:35 Правка А вот такой вопрос: Можно ли всё-таки использовать препроцессор в модуле из какого-нибудь установленного компилятора Си? И можно ли использовать данный модуль в Linux? Я пробовал, он сильно ругается... прогнать исходник препроцессором самому Как это самое сделать? Есть опция у VC++ /E, а как её использовать? И ещё: bsl_zcs, нельзя ли связаться по э/почте, а то доступ в форум у меня только "по праздникам"... У меня адрес на ukr.net: icestudent. |
|
|
Дата: Дек 12, 2003 10:09:41 · Поправил: IceStudent Правка Нет, всё-таки to be! Я почти закончил скрипт, но возникли вопросы о стандартах. 1. Например, определение макроконстанты Unicode: кто-то пишет через UNICODE_DEF, кто-то UNICODE или ещё как. А почему не использовать константу из С (_UNICODE)? 2. "Проект Windows.inc" — есть такой проект, всё, что можно, вписывается в этот файл. А может лучше просто использовать те файлы, что и в PlatformSDK, ведь потом проще будет обновлять их… 3. Что лучше использовать: утилиты конвертации файлов .lib в .inc или конвертировать определения функций из заголовочных файлов? [В первом случае как отличить FLOAT от DWORD?] - вопрос отпадает в связи с ответом Four-F Скрипт написан на Perl. Думаю, к Новому году будет полностью готов. Кому-то, кроме меня, он нужен? |
|
|
Дата: Дек 12, 2003 13:39:28 [ IceStudent: Что лучше использовать: утилиты конвертации файлов .lib в .inc или конвертировать определения функций из заголовочных файлов? ] Для _cdecl функций в либах нет кол-ва параметров, а в хидерах есть. |
|
|
Дата: Дек 30, 2003 17:56:55 Правка В связи с сессией доработка скрипта остановлена… Впрочем, и появление в форуме. Так что если кому что-то надо — пишите [post scriptum] Не вдалося поправити свою вiдповiдь :(… [/post scriptum] |
|
|
Дата: Янв 8, 2004 19:18:19 Правка Я всё конвертером болею… Почитал о pdb, нашёл несколько библиотек. Но пример из DIA не работает, pdbdump не скачивается — пересел снова за чистый Perl… С месяц назад очень нужно было, переписал пример, что из DIA SDK. Но там стОлько кода нужно внести, чтобы хоть минимальная функциональность была… Короче, засел снова за свой скрипт. Но замарочился со структурами — вспомнил о неудаче с pdbdump; слил заново, проверил версию. Но снова это "восьмое расширение"! 1. Что за формат файла такой, *.8 ? Ничем не мог распаковать его, пришлось HEX-редактором вытаскивать! 2. Почему не работает программа pdbdump.exe? Вроде вытащил правильно, она запускается, показывает "usage"-screen. При попытке дать ей файл .pdb выдаёт ошибку на непонятно каком языке. Видимо, придётся сливать исходники и продолжать самому разбираться. Чёрт, а исходники все под .gz… |
|
|
Дата: Янв 8, 2004 20:06:30 Это что-то новое... У меня все было ОК. И сам собирал, и исходники были ОК. Надо как-нибудь пересобрать под новый DIA... |
|
|
Дата: Янв 8, 2004 20:11:53 Правка volodya Нет, DIA и pdbdump я с сайта только сегодня взял. Ещё не попробовал. А проблемы с теми, что идут с Сети: MS DIA SDK из MS VS 7.0; pdbdump из их сайта, там архивы *.gz, а в них файлы с расширением *.8! А на этом сайте есть просто pdbdump.exe? Живой? |
|
|
Дата: Янв 8, 2004 20:17:59 Этот pdbdump и SDK с васма несовместимы. Надо перекомпилять. Этот SDK взят из 2003. Надо из 2002. |
|
|
Дата: Янв 8, 2004 20:22:24 Правка volodya Спасибо. У меня 2002 (aka 7.0) DIA SDK. Но pdbdump работает? "usage-screen" и у меня показывал, но поперхнулся на файле от link7.exe (v7.0.xxxx) |
|
|
Дата: Янв 9, 2004 12:51:07 · Поправил: Four-F [ IceStudent: При попытке дать ей файл .pdb выдаёт ошибку на непонятно каком языке. ] Это траблы с кодировкой. Скорее всего ей не нравится версия msdiaXX.dll, либо ты вообще забыл её в каталог кинуть! Могу прислать работающую связку pdbdump.exe + msdia20.dll (240Кб). |