Windows程序在start时,同Linux一样,要将动态库load进来,Linux会查找LD_LIBRARY_PATH, Windows会查找环境变量PATH,以下是各平台的查找路径:
 
   Linux: LD_LIBRARY_PATH
   Solaris:LD_LIBRARY_PATH
   HP: SHLID_PATH
   AIX: LIBPATH
   Windows: PATH
  这些只是各平台会查找的其中一个路径,如Solaris就还会查找RPATH。
  这不是这里要说的重点,在Linux及Unix平台上,程序在start时,如果查找到一个名字匹配,但格式不匹配的动态库,将报错,并退出,如32bit程序在LD_LIBRARY_PATH里面先找到了一个64bit的动态库,将报一个类似XXX.so: wrong ELF class: ELFCLASS64的错误,然后程序退出。
  Windows平台不一样,使用Procmon工具可以看到,即使在PATH路径里面找到一个错误位数的dll,程序也会尝试将它读进来,并且从Procmon里看不到错误信息,但可以推测它load不成功,因为从Procmon里面看到程序继续查找PATH里面的其它路径,尝试去找到正常的dll,如果后面的路径有一个位数匹配的dll,程序就能load进来,成功运行起来。


  这里要注意两件事,一是Windows平台load到位数不匹配的dll,不会被迫退出;二是用Procmon工具不能直接看出load dll是否出错,只能从后面的路径推测它出错了
Logo

更多推荐