2011-01-29 3 views
4

Просто для удовольствия и хихиканья Я пытаюсь создать 64k intro в delphi. Один из лучших исполняемых упаковщиков для приложений такого размера - kkrunchy от Farbrausch. Однако, когда я запускаю его на (в противном случае пустой) Delphi исполняемый файл, я получаю следующие выходные данныеkkrunchy - как избавиться от данных tls в исполняемом файле Delphi?

- ERROR: files with exports or tls data are not supported 

Я предполагаю, что с исполняемым файлом Delphi и может быть виновником, а у меня нет реальных неприятностей не положить в потные часы, пытаясь выяснить, какой из них и как изменить исполняемый файл или что-то подобное ... но, возможно, один из вас уже знает, или даже имеет некоторую информацию о том, как обойти эту проблему?

+1

Да, RaiseListPtr связан с обработкой исключений, и он должен быть threadvar, потому что каждому потоку нужен свой собственный список подъемов. Не уверен, есть ли способ изменить это. –

+0

Я еще не уверен, действительно ли мне нужно изменить его. Я могу жить без исключений и правильной обработки ошибок ввода-вывода (для этого конкретного приложения). Я не убежден, что я испортил GetTLS - это то, что приводит к сбою приложения ... похоже, это _after_ ExitProcess. –

+0

Переместил мои изменения в отдельный ответ, чтобы лучше соответствовать формату Q & A (улучшать будущие ссылки), а также отметить ответ Мейсона как правильный. –

ответ

3

Экспорт предназначен для библиотек DLL; маловероятно, что ваш EXE делает любой экспорт. TLS, с другой стороны, является локальным хранилищем. Если у вас есть какой-либо threadvar, то это может привести к ошибке. Кроме того, я думаю, что TLS использует встроенную обработку исключений, но я не понимаю всех деталей. Если это так, возможно, вы вообще не сможете использовать этот пакет.

+0

Спасибо, Мейсон! Это определенно TLS. Кажется, я помню, что Delphi всегда предопределяет его (тогда собственно управление потоками потоков вручную). Я начну просматривать system.pas. –

1

(В дополнение к ответу Мейсона, который является правильным).

Я запустил PE Viewer/Editor и могу подтвердить, что экспорт отсутствует. Итак, теперь возникает вопрос: почему TLS выделяется в приложении без потоков, и что мне с этим делать? Удаление его из таблицы PE прекрасно работает, за исключением ошибки приложения при завершении работы.

System.pas содержит 2 нити, InOutRes (для ошибок ввода-вывода) и RaiseListPtr. Мне не нужны эти два, чтобы быть нитями в моем приложении, но они кажутся незаменимыми для всей системы. Похоже на крепкий орешек.

В качестве обходного пути, я теперь преждевременно прекратить свой собственный процесс, используя

TerminateProcess(GetCurrentProcess, 0) 

, чтобы предотвратить ошибки во время надлежащего выключения (глубоко внутри более элегантной ExitProcess из _Halt0 Дельфи). На этапе postbuild я удаляю TLS из PE и упаковываю с помощью kkrunchy. До 8192 байт, и никаких проблем. На данный момент. Кодекс-этично, мне кажется, что меня следует положить за решетку. :)