Ошибка Internal Error: L3118 при попытке линковки obj файла с delphi

Тема в разделе "WASM.BEGINNERS", создана пользователем SOA, 15 авг 2010.

  1. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    Здравствуйте.
    Скажу сразу что знаю что здесь много народу не любит Delphi.
    Я не знал к какому типу топиков отнести свой вопрос, потому и написал в beginners.
    Вопрос в следующем есть проект на delphi7.1, также есть obj файл собранный на TASM5.0 я пытаюсь их слинковать вместе.
    Вопрос довольно специфичный на мой взгляд, потому что ошибка возникает не всегда, а по каким то непонятным для меня причинам в каких то проектах возникает, а в каких то нет.
    Ниже приведу два проекта

    Первый проект компилируется и работает

    Unit1.pas

    Код (Text):
    1. unit Unit1;
    2.  
    3. interface
    4.  
    5. uses
    6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    7.   Dialogs, StdCtrls;
    8.  
    9. type
    10.   TForm1 = class(TForm)
    11.     Edit1: TEdit;
    12.     Button1: TButton;
    13.     procedure Button1Click(Sender: TObject);
    14.   private
    15.     { Private declarations }
    16.   public
    17.     { Public declarations }
    18.   end;
    19.  
    20.   Procedure Movl(); STDCall; EXTERNAL;
    21.   {$L MOV_32.obj}
    22.  
    23. var
    24.   Form1: TForm1;
    25.   x:longint;
    26.  
    27. implementation
    28.  
    29. {$R *.dfm}
    30.  
    31. procedure TForm1.Button1Click(Sender: TObject);
    32. begin
    33.  
    34. Movl();
    35. Edit1.Text:=IntToStr(x);
    36. end;
    37.  
    38.  
    39. end.
    Mov_32.asm

    Код (Text):
    1. Title move for 32 bits
    2.  
    3. .386P
    4. .MODEL  FLAT, stdcall
    5. PUBLIC Movl
    6.  
    7. .DATA
    8. extrn x: DWORD
    9. a DD 64h
    10.  
    11. .CODE
    12. Movl    proc
    13. mov ax,WORD PTR a   ;ax<=== low word of a
    14. push bx
    15. mov bx,WORD PTR a+2 ;bx<=== high word of a
    16. mov WORD PTR x,ax   ;low word of x<=== ax
    17. mov WORD PTR x+2,bx ;high word of x<=== bx
    18. pop bx
    19. ret
    20. Movl    ENDP
    21.  
    22. END
    Следующий проект тоже не включает в себя никаких особенных действий на асме, но почему то при попытке компиляции с проектом delphi компилятор выдает внутреннюю ошибку линковщика 3118, отчего это происходит понять не могу.

    Unit1.pas

    Код (Text):
    1. unit Unit1;
    2.  
    3. interface
    4.  
    5. uses
    6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    7.   Dialogs, StdCtrls;
    8.  
    9. type
    10.   TForm1 = class(TForm)
    11.     Label1: TLabel;
    12.     Label4: TLabel;
    13.     Button2: TButton;
    14.     procedure Button2Click(Sender: TObject);
    15.   private
    16.     { Private declarations }
    17.   public
    18.     { Public declarations }
    19.   end;
    20.  
    21. Procedure EspNum();STDCall;EXTERNAL;
    22. Procedure WordIn();STDCall;EXTERNAL;
    23. {$L StackOut1}
    24.  
    25. var
    26.   Form1: TForm1;
    27.   ESPV: DWord;
    28.  
    29. implementation
    30.  
    31. {$R *.dfm}
    32.  
    33.  
    34. procedure TForm1.Button2Click(Sender: TObject);
    35. begin
    36. EspNum();
    37. Label1.Caption:=IntToStr(ESPV);
    38. WordIn();
    39. Label4.Caption:=IntToStr(ESPV);
    40. end;
    41.  
    42. end.
    StackOut1.asm

    Код (Text):
    1. Title StackOut for 32 bit
    2. .486P
    3. .MODEL flat, STDCall
    4.  
    5.  
    6. ;PUBLIC StackOut
    7. PUBLIC WordIn
    8. PUBLIC EspNum
    9.  
    10. .Data
    11. EXTRN ESPV: DWORD
    12.  
    13. a32 DD ?
    14. b32 DD ?
    15. c32 DD ?
    16. d32 DD ?
    17.  
    18. .CODE
    19.  
    20. WordIn proc
    21. mov a32,eax
    22. mov eax,110
    23. push ax
    24. push esp
    25. pop eax
    26. mov ESPV,eax
    27. pop ax
    28. mov eax,a32
    29. ret
    30. WordIn ENDP
    31.  
    32.  
    33.  
    34. EspNum proc
    35. mov a32,eax
    36. push esp
    37. pop eax
    38. mov ESPV,eax
    39. mov eax,a32
    40. ret
    41. EspNum ENDP
    42.  
    43. END
    Если ктолибо сталкивался с подобной проблемой, то пожалуйста отпишите как ее решить.

    P.S.
    Сразу отпишу что отладка кода для obj файла мне напоминает мазахизм, потому что код там вполне рабочий.
     
  2. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    Можно вопрос? Немного не по теме но всётаки. Чем вас не устраивают просто асмовские вставки?
    Код (Text):
    1. asm
    2.   mov eax,edx
    3.   add eax,var
    4.   ...
    5. end;
     
  3. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    DoctorWho
    Конечно можно, дело в том что пишут что BASM сильно ограничен в своих способностях и большого кода на нем скажем так не рекомендуют писать, а использовать для как раз таких небольших вставок ассемблерного кода.
    Конечно сразу возникает следующий вопрос где пишут?
    Например здесь

    http://webster.cs.ucr.edu/AoA/Windows/HTML/MixedLanguageProgramming2.html

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

    первая это то что я не делаю ничего непотребного на асме в obj файле

    вторая это то что ошибка имеет место быть даже в таких небольших примерах и это не игра моего воображения.

    Как вы уже наверно поняли я хочу линковать с проектом Delphi obj файл несколько большего размера.

    P.S. Надеюсь что ктонибудь сталкивался с подобной проблемой и знает как разрешить ошибку линковщика delphi.
     
  4. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    Все obj файлы вроде одного стандарта - COFF. Мб стоит попробовать другой линкер?

    З.Ы. Если чего сморозил не пинайте больно...
     
  5. jabocrack

    jabocrack New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    Попробуй сделать так.
    1. добавь в проект interface unit с указанием типов твоих внешних функций.
    2. для использования в проекте асм-функций тупо подключаешь interface unit.
    3. удали директивы линкера из исходников.
    4. добавь в проект obj-файлы asm -модулей.
    5. попробуй пересобрать проект.
    6. отпишись тут )))
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    DoctorWho
    В Delphi - omf
     
  7. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Intel OMF - Delphi 3
    Borland OMF - Delphi x
     
  8. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    jabocrack
    Все что вы написали есть в ссылке которую я дал, а также там пишут что лучше использовать вызов Pascal , либо Registr, вместо STDCall.
    Директивы линкера убирать нельзя ни в коем случае, потому что они то и сообщают линкеру, где брать объявленные функции.
    Также следует заметить что все это никоим образом не исправляет ситуации, ошибка как была, так она и остается.
    =(
     
  9. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    SOA
    Выскажу предположение - проект по-умолчанию компилится и линкуется на базе i386-команд, а во втором asm-e задана модель .486P... Может, в этом дело?
     
  10. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    gorodon
    Проверил, нет от использования другой(не 386P) модели процессора ничего не меняется.
    Собственно по логике вещей так и должно быть, ведь у старших моделей процессоров сохраняются команды старых моделей + новые команды типа MMX.
     
  11. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    На счёт конверсии OMF - COFF
    http://sites.google.com/site/delphibasics/home/delphibasicsprojects
    Advanced Delphi Driver Development Kit
    Архив весит 1,5 МБ. Папка bin, файл rmcoff.exe. Плюс там лежит микрософтовский link.exe

    (ред.) скачал и проверил АВ - в rmcoff.exe троян(trojan.win32.Starter.mg) сорри за поганый линк. Но думаю можно поискать что-нибудь похожее или поискать нормальный. А в остальном архив чист.
     
  12. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    Если что, то можно скачать object file converter отсюда

    http://www.agner.org/optimize/

    сам никогда правда не использовал, но люди пишут что неплохая программа.
     
  13. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    SOA
    А всётаки попробуйте другой линкер т.к. интересно поможет или нет.
     
  14. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    Ту прогу что я посоветовал НЕ КАЧАЙТЕ, попробывал нерабочий асм файл собрать на масме, а потом получившийся obj файл перекодировать из coff в omf, а после этого скомпилировать с delphi проектом, получил ошибку bad file format, хотя если верить автору программы должен был получиться родной для delphi omf файл.

    DoctorWho
    >А всётаки попробуйте другой линкер т.к. интересно поможет или нет.
    Майкрософтовский что ли?
    Я думаю он это есть откажется, потому что форматы у borland и ms разные не только в obj файлах, каждый ведь пишет линкер под свой формат.
     
  15. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    DoctorWho
    К тому же чтоб слинковать нужно собрать как минимум два obj файла, а здесь в наличии тоьлко один obj + делфи проект в исходниках.
     
  16. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    SOA
    Ну я предложил другой линкер снова потому что проги для конверсии всётаки есть. Кстати FASM умеет компилить в COFF. Может попробовать обратное? Т.е. скомпилить в фасме кофф и перевести его в омф. Благо coff2omf есть точно.
     
  17. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    Попробывал конвертировать masm'овский obj файл утилитой coff2omf отсюда

    http://www.wasm.ru/toollist.php?list=7

    и компилятор вновь написал мне bad obj file format + паровоз ошибок инициализации внешних функций из этого файла Ж8O.
     
  18. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    Если у кого то есть нормальный конвертер из coff в omf для obj файлов скажите как называется плиз.
     
  19. jabocrack

    jabocrack New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    попробовал скомпилить на d2010. Собирается, но выдает runtime error 216. облом. по аналогии с билдером, я думал, что в дельфи тоже можно в проект добавить обьектники. хнык.
     
  20. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    jabocrack
    Можно чуть поподробнее о последовательности ваших действий?
    А то я не совсем понял.