Здравствуйте У меня три вопроса: 1)У меня компилятор осуществляет вызов импортируемых функций следующим образом: call x ... x: jmp dword ptr y ... (таблица импорта) y: (вход в вызываемую функцию) незнает ли кто как указать компилятору осущестлять вызов таким образом: call dword ptr (x) ... (таблица импорта) x: (вход в вызываемую функцию) 2) Можно ли каким либо образом указать линкеру чтобы описанные таким образом сегменты: X segment public 'DATA' X ends ... X segment public 'DATA' X ends были помещены вместе в секцию data исполняемого файла? 3) Не знает ли кто нибудь почему после компиляции WinMain PROC hInstanceWORD, hPrevInstanceWORD, pCmdLineWORD, nCmdShowWORD push ebp mov ebp, esp ... WinMain endp становится: WinMain PROC hInstanceWORD, hPrevInstanceWORD, pCmdLineWORD, nCmdShowWORD push ebp mov ebp, esp push ebp mov ebp, esp ... WinMain endp
acdel1 1) Искать явно не пробовал, не первый раз обсуждается. Читай статью Edmond'a ("Записки Дзенствующего"). 2) Подобные одинаковые сегменты линкер объединяет в один. Если они не совсем одинаковы, смотри опции командной строки линкера (/merge) 3) Потому что ML генерит код исходя из описания подпрограммы (proc)и своих опций (.model). Хочешь сам всё делать - смотри справку ML (option prologue, option epilogue).
Благодарю вас за помощь. по поводу второго вопроса хочу уточнить: мне необходимо чтобы эти сегменты находились вместе (последовательно один за другим) независимо от того где они описаны т.е. в общем то до линкования они расположены в разных *.obj файлах. т.е. до линкования 1.obj ... X segment public 'DATA' X ends ... 2.obj ... X segment public 'DATA' X ends ... а в исполняемом файле ... .data ... X segment public 'DATA' X ends X segment public 'DATA' X ends ... можно ли как нибудь указать это линкеру?
Ты что-то чудишь. .data - это и есть "segment public 'DATA'". Точное написание смотри в справке или в примерах от TheSvin
Да нет какие уж тут чудеса - Просто в libc.lib(ctr0dat.obj) есть такая функция _cinit Код (Text): __cinit proc near mov eax, dword ptr ds:__FPinit test eax, eax jz short loc_0_57 call eax ; __FPinit loc_0_57: push offset ___xi_z push offset ___xi_a call __initterm push offset ___xc_z push offset ___xc_a call __initterm add esp, 10h retn __cinit endp где ___xc_z и ___xc_a в ctr0init.obj Код (Text): _CRT$XCZ segment dword public 'DATA' use32 assume cs:_CRT$XCZ ;org 10h public ___xc_z ___xc_z db 0 ; db 0 ; db 0 ; db 0 ; _CRT$XCZ ends ; =================================================== ; Segment type: Pure data _CRT$XCA segment dword public 'DATA' use32 assume cs:_CRT$XCA ;org 14h public ___xc_a ___xc_a db 0 ; db 0 ; db 0 ; db 0 ; _CRT$XCA ends так вот мне нужно как то поместить адреса своих функций между __xc_z и __xc_a. _CRT$XCZ _CRT$XCA сегменты помещаются в самом начале секции .data. Я думал как ни будь записать адреса в _CRT$XCZ но что то пока ничего не выходит -
2 Peshuha Тогда мне будет не подключить libc.lib, т.к. компилятор будет сообщать об ошибке: переобъявление __xc_z и __xc_a. Можно, конечно, сделать как вы говорите, выкинув предворительно ctr0init.obj из libc.lib, но я всё еще надеюсь обойтись без таких радикальных средств -
Благодарю всех за помощь. Проблема решилась следующим образом: при внимательном рассмотрении _CRT$XCZ _CRT$XCA оказались .CRT$XCZ .CRT$XCA таким образом, добавив в .asm "option dotname" и сделав свой .CRT$XCZ, получаем искомое. -