Пытался тут написать Win32-программу, не импортирующую ни одной функции из DLL-ек. Для этого нашел в памяти (через стек) kernel32.dll, её таблицу экспорта, а в ней - функцию GetProcAddress, при помощи которой, в свою очередь, получил адрес ExitProcess. Ну, в общем-то, это к делу, наверное, не очень-то относится. Данная программа компилируется, однако, линкер вылетает с ошибкой Код (Text): LINK : error : Internal error during ReadSymbolTable ExceptionCode = C0000005 ExceptionFlags = 00000000 ExceptionAddress = 00436AE1 NumberParameters = 00000002 ExceptionInformation[ 0] = 00000000 ExceptionInformation[ 1] = 00000038 Причем, если в конец программы Код (Text): xor eax, eax push eax call f_ExitProcess (в f_ExitProcess записан адрес ExitProcess) дописываю call ExitProcess (что, в принципе, влечет за собой импорт функции ExitProcess) - всё линкуется и работает замечательно. Таким образом, чтобы заставить всё это слинковаться, в программу приходится включать "для виду" произвольные Win32-функции. Все вышесказанное справедливо при линковании с ключом /DEBUG. С ключом /RELEASE программа работает и без "добавок". Я использую masm32, компилирую с ключами /c /coff /Cp /Zi /Zd /Zf /nologo /I"..",v.asm 1517975170__v.Asm
NCRangeR Какой линкер? Сделал bat-файл Код (Text): @echo off set path=C:\MASM32\BIN;%PATH% set include=C:\MASM32\INCLUDE;%INCLUDE% set lib=C:\MASM32\LIB;%LIB% ml.exe /c /coff /Cp /Zi /Zd /Zf v.asm link.exe /DEBUG /subsystem:windows v.obj dir v.* запустил и получил Код (Text): C:\2>do_it.bat Том в устройстве C не имеет метки. Серийный номер тома: 84F7-E3EC Содержимое папки C:\2 11.11.2004 07:52 3 321 v.asm 1 файлов 3 321 байт 0 папок 9 879 871 488 байт свободно Microsoft (R) Macro Assembler Version 6.15.8803 Copyright (C) Microsoft Corp 1981-2000. All rights reserved Assembling: v.asm Microsoft (R) Incremental Linker Version 5.12.8078 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. Том в устройстве C не имеет метки. Серийный номер тома: 84F7-E3EC Содержимое папки C:\2 11.11.2004 07:52 3 321 v.asm 11.11.2004 08:05 6 443 v.exe 11.11.2004 08:05 9 200 v.ilk 11.11.2004 08:05 225 422 v.obj 11.11.2004 08:05 345 088 v.pdb 5 файлов 589 474 байт 0 папок 9 879 273 472 байт свободно C:\2> PS call Exitprocess в конце исходника закомментирован.
Спасибо за ответ. Однако, у меня тот же самый bat (с поправкой на то, что masm находится в g:\masm32, но, думаю, это несущественно) выдает следующее: Код (Text): Microsoft (R) Macro Assembler Version 6.14.8444 Copyright (C) Microsoft Corp 1981-1997. All rights reserved Assembling: v.asm Microsoft (R) Incremental Linker Version 5.12.8078 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. LINK : LNK6004: v.exe not found or not built by the last incremental link; performing full link LINK : error : Internal error during ReadSymbolTable ExceptionCode = C0000005 ExceptionFlags = 00000000 ExceptionAddress = 00436AE1 NumberParameters = 00000002 ExceptionInformation[ 0] = 00000000 ExceptionInformation[ 1] = 00000038 CONTEXT: Eax = 00000000 Esp = 0012F990 Ebx = 00000000 Ebp = 3FFF0000 Ecx = 00000000 Esi = 40000040 Edx = 0012F764 Edi = 3FFF0000 Eip = 00436AE1 EFlags = 00010206 SegCs = 0000001B SegDs = 00000023 SegSs = 00000023 SegEs = 00000023 SegFs = 0000003B SegGs = 00000000 Dr0 = 0012F990 Dr3 = 00000000 Dr1 = 3FFF0000 Dr6 = 00000000 Dr2 = 00000000 Dr7 = 00000000 Volume in drive G is PROGRAMMING Volume Serial Number is 0CE2-B2BE Directory of G:\bbb 12.11.2004 06:21 3я321 v.Asm 12.11.2004 06:22 196 v.bat 12.11.2004 06:24 524я288 v.exe 12.11.2004 06:24 262я144 v.ilk 12.11.2004 06:24 225я416 v.obj 12.11.2004 06:24 25я600 v.pdb 12.11.2004 06:24 0 v.txt 7 File(s) 1я040я965 bytes 0 Dir(s) 940я180я992 bytes free Провел дополнительные эксперименты, и получил следующее: 1. Линк с дополнительным ключом /debugtype:coff - работает, но количество отладочной информации, мягко говоря, уменьшается. 2. Линк Код (Text): 5,O,$B\LINK.EXE $3 /SUBSYSTEM:WINDOWS /DEBUG /VERSION:4.0 /LIBPATH:"$L" /OUT:"$5" [b]/DEBUGTYPE:BOTH /PDB:NONE[/b] (выдрал из конфигурации RadASMa) работает, отладочная информация в порядке, но линкер выдает Код (Text): LINK : warning LNK4027: CVPACK error Хотя, можно сказать, что проблема и решена, все-таки хочется узнать, с чем я столкнулся.
NCRangeR Попробовал с ml.exe v6.14.8444, но линковал link.exe /DEBUG /subsystem:windows v.obj получил "твои" ошибки. Значит проблема в ml.exe 2. Линк ... работает ... но линкер выдает ... Сделай CVPACK.EXE видимым через %PATH% и предупреждение пропадет.
Тут уже несколько раз проскакивала информация о неправильном поведении Link-ера Последнее сообщение было как раз про немалую роль RadAsm. Иногда он формирует строки с неправильным синтаксисом, а у тебя видимо "навел" твою ошибку. Во всех случаях участвуют двойные кавычки. Сам RadAsm не использую, поэтому больше ничего не могу сказать.