kkrunchy - как избавиться от данных tls в исполняемом файле Delphi? - PullRequest
4 голосов
/ 29 января 2011

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

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

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

Ответы [ 2 ]

3 голосов
/ 29 января 2011

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

1 голос
/ 01 февраля 2011

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

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

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

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

TerminateProcess( GetCurrentProcess, 0 )

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

...