程序没有导入指定的函数

Volftooth 2012-02-06 08:57:56
在程序中调用了 strcmp 和 strcpy 这两个函数、
编译后发现没有导入这两个函数、
编译环境是 VS2010、
链接到 MSVCRT.DLL 这个文件、
...全文
86 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
AnYidan 2012-02-06
  • 打赏
  • 举报
回复
没有用过 Dependecy Walker,不过下面是 v2010 release 下产生的汇编, 不知是否有帮助

看 375, 376 line

; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01

TITLE D:\Huegli\VS2010\Projects\new\Calculator\Calculator\calculator.cpp
.686P
.XMM
include listing.inc
.model flat

INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES

CONST SEGMENT
$SG5504 DB '123456789abcdef', 00H
$SG5505 DB '123456789abcdef', 00H
$SG5507 DB 'fedcba987654321', 00H
$SG5508 DB 'pause', 00H
CONST ENDS
PUBLIC __$ArrayPad$
PUBLIC _main
EXTRN __imp__system:PROC
EXTRN _strcmp:PROC
EXTRN _strcpy:PROC
EXTRN ___security_cookie:DWORD
EXTRN @__security_check_cookie@4:PROC
EXTRN @_RTC_CheckStackVars@8:PROC
EXTRN __RTC_CheckEsp:PROC
EXTRN __RTC_Shutdown:PROC
EXTRN __RTC_InitBase:PROC
; COMDAT rtc$TMZ
; File d:\huegli\vs2010\projects\new\calculator\calculator\calculator.cpp
rtc$TMZ SEGMENT
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ ENDS
; COMDAT rtc$IMZ
rtc$IMZ SEGMENT
__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
; Function compile flags: /Odtp /RTCsu
rtc$IMZ ENDS
_TEXT SEGMENT
_a2$ = -48 ; size = 16
_a1$ = -24 ; size = 16
__$ArrayPad$ = -4 ; size = 4
_main PROC
; Line 373
push ebp
mov ebp, esp
sub esp, 52 ; 00000034H
push esi
push edi
lea edi, DWORD PTR [ebp-52]
mov ecx, 13 ; 0000000dH
mov eax, -858993460 ; ccccccccH
rep stosd
mov eax, DWORD PTR ___security_cookie
xor eax, ebp
mov DWORD PTR __$ArrayPad$[ebp], eax
; Line 375
push OFFSET $SG5504
lea eax, DWORD PTR _a1$[ebp]
push eax
call _strcpy
add esp, 8
; Line 376
push OFFSET $SG5505
lea ecx, DWORD PTR _a2$[ebp]
push ecx
call _strcpy
add esp, 8
; Line 377
lea edx, DWORD PTR _a2$[ebp]
push edx
lea eax, DWORD PTR _a1$[ebp]
push eax
call _strcmp
add esp, 8
test eax, eax
jne SHORT $LN1@main
; Line 379
push OFFSET $SG5507
lea ecx, DWORD PTR _a1$[ebp]
push ecx
call _strcpy
add esp, 8
$LN1@main:
; Line 384
mov esi, esp
push OFFSET $SG5508
call DWORD PTR __imp__system
add esp, 4
cmp esi, esp
call __RTC_CheckEsp
; Line 385
xor eax, eax
; Line 387
push edx
mov ecx, ebp
push eax
lea edx, DWORD PTR $LN7@main
call @_RTC_CheckStackVars@8
pop eax
pop edx
pop edi
pop esi
mov ecx, DWORD PTR __$ArrayPad$[ebp]
xor ecx, ebp
call @__security_check_cookie@4
add esp, 52 ; 00000034H
cmp ebp, esp
call __RTC_CheckEsp
mov esp, ebp
pop ebp
ret 0
$LN7@main:
DD 2
DD $LN6@main
$LN6@main:
DD -24 ; ffffffe8H
DD 16 ; 00000010H
DD $LN4@main
DD -48 ; ffffffd0H
DD 16 ; 00000010H
DD $LN5@main
$LN5@main:
DB 97 ; 00000061H
DB 50 ; 00000032H
DB 0
$LN4@main:
DB 97 ; 00000061H
DB 49 ; 00000031H
DB 0
_main ENDP
_TEXT ENDS
END
Lactoferrin 2012-02-06
  • 打赏
  • 举报
回复
搜一下intrinsic function
Volftooth 2012-02-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lactoferrin 的回复:]

这里strcmp的结果是确定的,所以可以去掉
你把优化完全关了再看
[/Quote]

意思就是编译器自己把这个函数的代码直接嵌入到程序里面了、不需要再通过外部 DLL 调用、
还有编译器可以优化无用代码、

现在编译器太牛了、、、、
Lactoferrin 2012-02-06
  • 打赏
  • 举报
回复
这里strcmp的结果是确定的,所以可以去掉
你把优化完全关了再看
Volftooth 2012-02-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lactoferrin 的回复:]

strcpy这些函数的意思编译器是知道的,但strcpy_s它就不一定知道,所以没法优化
[/Quote]

有点懂了、不过刚刚是编译器的事、
我改变优化级别为0编译一下程序再改优化级别为2、
再编译虽然也是没有 Strcmp 不过程序的功能正常了、
Lactoferrin 2012-02-06
  • 打赏
  • 举报
回复
strcpy这些函数的意思编译器是知道的,但strcpy_s它就不一定知道,所以没法优化
Lactoferrin 2012-02-06
  • 打赏
  • 举报
回复
因为编译器知道你的整个程序等于什么都没做,所以全优化掉了
Volftooth 2012-02-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 anyidan 的回复:]

lz 如何发现没有 导入这两个函数的?
[/Quote]

使用 Dependecy Walker、
Volftooth 2012-02-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lactoferrin 的回复:]

一些很基本的函数可以被inline掉
strcpy_s不在此列
[/Quote]


char a1[16], a2[16];
strcpy(a1, "123456789abcdef");
strcpy(a2, "123456789abcdef");
if(strcmp(a1, a2) == 0)
{
strcpy(a1, "fedcba987654321");
}


这上面是我测试的一个代码、这代码我反汇编看他根本没有编译成机器码、


#include <windows.h>
#pragma comment(lib, "_vmsvcrt.lib")
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char a1[16], a2[16];
strcpy(a1, "123456789abcdef");
strcpy(a2, "123456789abcdef");
if(strcmp(a1, a2) == 0)
{
strcpy(a1, "fedcba987654321");
}

return 0;
012A1000 xor eax,eax
}
012A1002 ret 10h


它就给我生成了两句汇编、真不知道哪错了、
AnYidan 2012-02-06
  • 打赏
  • 举报
回复
lz 如何发现没有 导入这两个函数的?
Lactoferrin 2012-02-06
  • 打赏
  • 举报
回复
一些很基本的函数可以被inline掉
strcpy_s不在此列
Volftooth 2012-02-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lactoferrin 的回复:]

是不是被优化掉了,或者用静态库
[/Quote]

在 debug 模式下就正常、搞不懂、
strcpy 编译器也能优化?、
把 strcpy 换成 strcpy_s 就可以导入了、何解?、
Lactoferrin 2012-02-06
  • 打赏
  • 举报
回复
是不是被优化掉了,或者用静态库

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧