Дело о двух dll

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Дело о двух dll

Сообщение FedeX » 04.01.2007 17:10:02

Help, допоможіть, помогите!

Написал я на FPC две dll с функциями.
Использовал их в разных проектах... Но вот понадобилось мне в одном проекте использовать их вместе...
И вот вчём проблема. Проект использующий две мои длл-и даже не запускается. Пишет:
"Ошибка при инициализации приложения (0xc000007b). Для віхода из приложения нажмите кнопку ОК."
И это при том, что я даже ещё не вызываю никаких функций из этих библиотек. Вообщем я теряюсь в догадках.
Может кто знает, чо это может быть?
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение first-leon » 04.01.2007 20:23:41

Может функции из разных библиотек имеют одинаковые имена?
first-leon
новенький
 
Сообщения: 68
Зарегистрирован: 20.04.2006 18:46:31

Сообщение Sergei I. Gorelkin » 04.01.2007 23:07:27

Возможно, что из-за указания неправильных ключей при компиляции dll-ки получились без таблиц релокации (.reloc). Такие только по одной в процесс загружаются...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение FedeX » 05.01.2007 07:14:41

first-leon писал(а):Может функции из разных библиотек имеют одинаковые имена?

Исключено. В одной длл специально для этого все функции начинаются на phxl, в другой - на hf.

Возможно, что из-за указания неправильных ключей при компиляции dll-ки получились без таблиц релокации (.reloc).

Вполне может быть. Я пользовался средой Лазарус для написания. Вручную ключи я не выставлял. А какие это ключи?
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение FedeX » 05.01.2007 07:54:07

Нашол такой ключ: -WR (-WR+).
Про него написано "Generate a relocation section".
Вставил в Лазаре в параметрах компилятора
(Лазарь сгенерил параметры: -S2g -vewnhi -Fu. -ohf.dll -WR+).
Перекомпилил обе библиотечки, но таже самая ошибка... :(
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение FedeX » 05.01.2007 08:31:32

В поисках истины даже умудрился написать альтернативный упрощённый SysUtils (думал в нём причина). В результате только размер одной длл стал не 207кб, как раньше, а 130кб (чему я очень рад :D ), и смещение ошибки стало не (0xc000007b), а (0xc000005b).
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение Сквозняк » 05.01.2007 16:22:41

Если ошибка хорошо спряталась, то проще заново переписать проблемный участок программы. Попробуй слить обе dll в одну.
Сквозняк
энтузиаст
 
Сообщения: 1126
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Sergei I. Gorelkin » 05.01.2007 17:05:58

Правильный ключ - -WB. Рекомендую еще с его же помощью разные базовые адреса указать, например, для одной dll -WB400000, а для другой -WB410000.
На Лазарь я бы не полагался, он иногда левые ключи выдает и при этом еще и ругань компилятора не показывает.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение FedeX » 05.01.2007 19:14:28

Странно... Очень странно...
Дело о двух dll приобретает мистический характер...
Когда я ставлю дллям -WB400000 и -WB410000. Происходит та же самая ошибка и, к тому же, длл-и отказываются работать даже по одной!
Просто параметр -WB у обоих дллей ничего не даёт.
Зато когда у одной длл стоит просто -WB, а у другой -WB410000 они прекрасно работают вместе, но та у которой -WB410000 уже не хочет работать одна...

Вот. :roll: Я лично ничего не пойму...
Кстати, можно узнать что за смещения такие 410000 и 400000? Я пробовал ставить другие, но писало, что это не Win32 приложение или библиотека.

Попробуй слить обе dll в одну.

Это уже на крайняк. Да и интересно - в чём же дело.
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение Sergei I. Gorelkin » 05.01.2007 20:49:55

Вообще, в предыдущем сообщении я малость прогнал: 400000 - это адрес загрузки .exe, для .dll обычно используют 10000000.

Интересно другое: я сейчас быстренько сляпал две .dll и программу, которая их использует. Скомпилировал безо всяких ключей вообще. Вс е работает, причем как при компиляции версией 2.1.1, так и версией 2.0.4. У обоих .dll базовый адрес один и тот же (10000000), но таблица релокации на месте. В связи с чем возникает вопрос уже о версии компилятора...

Код: Выделить всё
library lib;

procedure test1; stdcall;
begin
end;

exports Test1;

begin
end.
---
library lib2;

procedure test2; stdcall;
begin
end;

exports Test2;

begin
end.
---
program libtest;

procedure Test1; stdcall; external 'lib';
procedure Test2; stdcall; external 'lib2';

begin
  test1;
  test2;
end.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение FedeX » 05.01.2007 21:30:14

У меня Лазарь 0.9.16 бета. И с ним компилер 2.0.2.

Но меня всё-таки беспокоит SysUtils. Ведь две длл уживаются нормально тогда когда у одной из них (той из которой мне SysUtils удалить не удалось) при компиляции стояла директива -W410000.

Ладно попробую установить более новый компилер. Он у меня как раз где-то валялся. Не помню почему я его снёс.
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение FedeX » 11.01.2007 13:08:12

Установил 0.9.2 - тоже самое.
Точно, Дело в Лазаре.
Точно, букву в букву повторил ваш код (через один пост сверху), скомпилил две длл (lib и lib2) с пустыми процедурами и проект, который их использует. И таже самая фигня... Вообщем попробую ещё поиграть с ключами, или сменить ИДЕ. Стандартное консольное ИДЕ уже несколько раз пытался использовать, но неудобно и всё тут, лично мне...
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение FedeX » 11.01.2007 14:40:03

Всё, проблема решена!
Оказывается дело было вот в чём.
Лазарь по умолчанию добавляет ключ -gl (выдать номера строк в ошибках времени исполнения). Это удобно обычно. Но вызывает сильное увеличение размеров ехе-шников. Я по привычке пользовался утилиткой strip чтоб очистить от лишнего веса свои длл, когда в отслеживании номеров строк необходимость отпадала. Но видно strip не до конца всё очищает и в памяти проекта рождается ещё какойто лишний следящий поток, причём этот поток (я так сабе это представляю) видимо пытается занять строго определённое место в памяти приложения, а так как длл хранят данные в памяти приложения, то несколько таких потоков от разных длл вступают в конфликт.

Так что если компилите в Лазаре длл отключайте
Проект->Опции компилятора->Связывание->выдать номера строк в ошибках времени исполнения
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение Sergei I. Gorelkin » 11.01.2007 17:04:42

А у меня, а у меня... :) С версией 2.0.4 этот простейший тест продолжает работать, и если компилить с -gl, и если потом делать strip. А версия 2.1.1 вообще не хочет компилить библиотеку с ключом -gl: Internal error 200603033.
Так что, похоже, дело не в -gl... Кстати, Лазарь должен сам делать strip, если соответствующую галку поставить. Но я ни разу этого не наблюдал, всегда приходится делать strip самостоятельно...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение FedeX » 12.01.2007 10:22:34

Вывод - и Лазарь(в особенности) и FPC всё ещё достаточно сырые :cry: .

Кстати. Может не совсем в тему... Я хотел бы к одной длл прилинковать (если такое возможно) обьектные файлы скомпиленные сишкой, чтоб можно было использовать функции из них. Такое вообще возможно :?: . Я имею ввиду обьектники OggVorbits.
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru