Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: За что DDK линкер так любит CRT  (Прочитано 12243 раз)
0 Пользователей и 1 Гость смотрят эту тему.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« : 16-02-2010 06:00 » 

У меня стоит WDK 7.0.0.7600. Для сборки драйверов использую штатное средство WDK (DDK) - build (из setenv).  Собирал и простенькие тестовые консольные утилиты. Решил вот собрать НЕконсольную программу. Библиотека C мне тут совсем не нужна, скорее наоборот, надо чтоб ее не было. Программа должна вызвать MessageBox и всё, на выход (с вещами). Пишу в sources
Код:
TARGETNAME=AccessVio
TARGETTYPE=PROGRAM

UMTYPE=windows
UMENTRY=winmain
USE_NOLIBS=1

MSC_WARNING_LEVEL=/W1

_NT_TARGET_VERSION= $(_NT_TARGET_VERSION_WINXP)

TARGETLIBS=\
        $(SDK_LIB_PATH)\user32.lib

INCLUDES=$(DDK_INC_PATH);

SOURCES=accessvio.c

Даю старт (build), а линкер мне в ответ (привожу лог полностью)
Код:
BUILD: Computing Include file dependencies:
BUILD: Examining e:\code\prog\test\access_vio directory for files to compile.
1>Compiling and Linking e:\code\prog\test\access_vio *************
1>'nmake.exe /nologo BUILDMSG=Stop. -i BUILD_PASS=PASS2 LINKONLY=1 NOPASS0=1 MAKEDIR_RELATIVE_TO_BASEDIR='
1>BUILDMSG: _NT_TARGET_VERSION SET TO WINXP
1> cl @e:\code\prog\test\access_vio\objfre_wxp_x86\i386\cl.rsp
1>Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.207 for 80x86
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>cl /Fo"e:\code\prog\test\access_vio\objfre_wxp_x86\i386/"
1> /FC
1> /Ii386
1> /I.
1> /IC:\WinDDK7600.16385.0\inc\ddk
1> /Ie:\code\prog\test\access_vio\objfre_wxp_x86\i386
1> /IC:\WinDDK7600.16385.0\inc\api
1> /IC:\WinDDK7600.16385.0\inc\api
1> /IC:\WinDDK7600.16385.0\inc\crt
1> /D_X86_=1
1> /Di386=1
1> /DSTD_CALL
1> /DCONDITION_HANDLING=1
1> /DNT_UP=1
1> /DNT_INST=0
1> /DWIN32=100
1> /D_NT1X_=100
1> /DWINNT=1
1> /D_WIN32_WINNT=0x0501
1> /DWINVER=0x0501
1> /D_WIN32_IE=0x0603
1> /DWIN32_LEAN_AND_MEAN=1
1> /DDEVL=1
1> /D__BUILDMACHINE__=WinDDK
1> /DFPO=0
1> /DNDEBUG
1> /DNDEBUG
1> /DNTDDI_VERSION=0x05010200
1> /DPSAPI_VERSION=1
1> /c
1> /Zc:wchar_t-
1> /Zl
1> /Zp8
1> /Gy
1> /Gm-
1> /W1
1> /WX
1> /Gz
1> /hotpatch
1> /EHs-c-
1> /GR-
1> /GF
1> /GS
1> /Zi
1> /Oxs
1> /Oy-
1> /Zi
1> /Fde:\code\prog\test\access_vio\objfre_wxp_x86\i386\
1> /DKMDF_MAJOR_VERSION_STRING=01
1> /DKMDF_MINOR_VERSION_STRING=009
1> /wd4603
1> /wd4627
1> /typedil-
1> /FIC:\WinDDK7600.16385.0\inc\api\warning.h
1> .\accessvio.c
1>accessvio.c
1> link.exe /out:e:\code\prog\test\access_vio\objfre_wxp_x86\i386\AccessVio.exe /machine:ix86 @e:\code\prog\test\access_vio\objfre_wxp_x86\i386\lnk.rsp
1>Microsoft (R) Incremental Linker Version 9.00.30729.207
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>/MERGE:_PAGE=PAGE
1>/MERGE:_TEXT=.text
1>/SECTION:INIT,d
1>/OPT:REF
1>/OPT:ICF
1>/IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221
1>/INCREMENTAL:NO
1>/release
1>/NODEFAULTLIB
1>/WX
1>/debug
1>/debugtype:cv,fixup,pdata
1>/version:6.1
1>/osversion:6.1
1>/functionpadmin:5
1>/safeseh
1>/nxcompat
1>/merge:.rdata=.text
1>/pdbcompress
1>/STACK:0x40000,0x2000
1>/tsaware
1>/dynamicbase
1>/subsystem:windows,5.01
1>/base:@C:\WinDDK7600.16385.0\bin\coffbase.txt,usermode
1>/entry:WinMainCRTStartup
1>e:\code\prog\test\access_vio\objfre_wxp_x86\i386\accessvio.obj
1>c:\winddk7600.16385.0\lib\wxp\i386\BufferOverflowU.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\advapi32.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\kernel32.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\gdi32.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\user32.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\int64.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\user32.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\sehupd.lib
1>LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup
1>errors in directory e:\code\prog\test\access_vio
1>link : error LNK2001: unresolved external symbol _WinMainCRTStartup
1>e:\code\prog\test\access_vio\objfre_wxp_x86\i386\AccessVio.exe : fatal error LNK1120: 1 unresolved externals
1>e:\code\prog\test\access_vio\objfre_wxp_x86\i386\accessvio.exe : error LNK1120: 1 unresolved externals

Попробовал добавить в sources
Код:
LINKER_FLAGS= $(LINKER_FLAGS) /entry:WinMain

Ниикакой реакции. Тоже самое. Зачем он так со мной? И зачем линковать CRT, когда я явно говорю ему что так не нужно делать.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 16-02-2010 06:44 » 

а почему WinMain то? для консольной то программы?  Ага
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 16-02-2010 06:45 » 

Цитата: resource
Решил вот собрать НЕконсольную программу
и UMTYPE=windows
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 16-02-2010 06:51 » 

аааа. тогда что нибудь типа:
http://dic.academic.ru/dic.nsf/ruwiki/377887

PS туплю с утра) еще не проснулся)
« Последнее редактирование: 16-02-2010 06:53 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 16-02-2010 06:57 » 

Блин, ну ничего себе там способ описан (функция Мэта Питрека  Улыбаюсь ). Зачем вообще линкер так делает, ведь я пишу ему USE_NOLIBS=1 (и /NODEFAULTLIB пробовал, тоже самое). Почему он игнорирует. В VS писал, нормально было, не линковал дерьма всякого без спроса. Я вообще как-то думал, что там практически один и тот же линкер (и компилятор тоже)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 16-02-2010 07:14 » 

сейчас не знаю... а раньше линкер от VS6 у меня не получалось заставить драйвер скомпилировать... может не разобрался тогда.
не люблю я build) в ней ковырятся сложнее, чем в настройках студии)
посмотрите еще ссылки типа таки...
а вообще разбираться надо... с чего он вдруг включает это дело. там ключей много.
я ссылок накидал в соседней теме
https://forum.shelek.ru/index.php/topic,23414.msg226847.html#msg226847
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 16-02-2010 07:28 » 

ЗЫ вы когда WinMain определяли, вы ее так определили?
int WINAPI WinMain(void)
или как обычно?
int WINAPI WinMainCRTStartup(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)? Ага
линкер - первую наверное пытался искать)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 16-02-2010 08:13 » 

Писал int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow).
Попробовал int WINAPI WinMainCRTStartup(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow). Слинковалось конечно, но это не есть гуд. Это вообще, если хотите, не наш метод. Потому что, посути линкер не слушается моих приказов, а я извращаюсь. А сколько еще полезных опций линкера, которые он не будет слушать.

Когда функция (входная) называется WinMain, задаю такую вещь в sources
Код:
LINKER_FLAGS= $(LINKER_FLAGS) /subsystem:windows /nodefaultlib /entry:WinMain 

build

линкер пишет мне письмо
Код:
1> link.exe /out:e:\code\prog\test\access_vio\objfre_wxp_x86\i386\AccessVio.exe /machine:ix86 @e:\code\prog\test\access_vio\objfre_wxp_x86\i386\lnk.rsp
1>Microsoft (R) Incremental Linker Version 9.00.30729.207
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>/subsystem:windows
1>/nodefaultlib
1>/entry:WinMain
1>/MERGE:_PAGE=PAGE
1>/MERGE:_TEXT=.text
1>/SECTION:INIT,d
1>/OPT:REF
1>/OPT:ICF
1>/IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221
1>/INCREMENTAL:NO
1>/release
1>/NODEFAULTLIB
1>/WX
1>/debug
1>/debugtype:cv,fixup,pdata
1>/version:6.1
1>/osversion:6.1
1>/functionpadmin:5
1>/safeseh
1>/nxcompat
1>/merge:.rdata=.text
1>/pdbcompress
1>/STACK:0x40000,0x2000
1>/tsaware
1>/dynamicbase
1>/subsystem:windows,5.01
1>/base:@C:\WinDDK7600.16385.0\bin\coffbase.txt,usermode
1>/entry:WinMainCRTStartup
1>e:\code\prog\test\access_vio\objfre_wxp_x86\i386\accessvio.obj
1>c:\winddk7600.16385.0\lib\wxp\i386\BufferOverflowU.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\advapi32.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\kernel32.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\gdi32.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\user32.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\int64.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\user32.lib
1>c:\winddk7600.16385.0\lib\wxp\i386\sehupd.lib
1>LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup
1>errors in directory e:\code\prog\test\access_vio
1>link : error LNK2001: unresolved external symbol _WinMainCRTStartup
1>e:\code\prog\test\access_vio\objfre_wxp_x86\i386\AccessVio.exe : fatal error LNK1120: 1 unresolved externals
1>e:\code\prog\test\access_vio\objfre_wxp_x86\i386\accessvio.exe : error LNK1120: 1 unresolved externals

Отсюда явно выделяется, что он видит мое "/entry:WinMain", но потом заменяет это дело на "/entry:WinMainCRTStartup".
Что за самоуправство? Не понимаю. Откуда взялось это /entry:WinMainCRTStartup? Где-то ж оно значит написано. И /NODEFAULTLIB второй раз пишет. Первый - мой. А второй....
« Последнее редактирование: 16-02-2010 08:16 от resource » Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 16-02-2010 08:51 » new

 Внимание! Говорит и показывает...  заГАДка разгадана. Разгадал (будете улыбаться) нажав F3 в корневой папке WDK. Поискав WinMainCRTStartup внутри файлов, выяснилось следующее.
по адресу %DDKPATH%\bin лежит чудесный файл makefile.new Главное - кучность!
Почитав, то что в этом файле пишут, всё становится ясно. в общем (как я сам себе понял) если CRT не используется, то в sources надо писать
Код:
UMENTRYABS=WinMain

А если CRT используется, то UMENTRY=<winmain | wwinmain| main | wmain> - всё равно, потому что, будет заменено на соответствующий ....MainCRTStartup
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines