libpng – Visual Studio 2005

Utiliser la libpng ça peut être pratique pour, au hasard le plus total, charger et sauvegarder des PNG, seulement avec Visual Studio.net 2005 c’est pas une sinécure. Petit guide d’utilisation qui a marché pour moi..

Etat initial

Le gros problème de la libpng fourni en binaire et Visual Studio 2005 semble être un problème de runtime : le dernier visual studio utilise la msvcrt80(d).dll , qui est complètement multithreadé. Pour comparaison, voici la liste d’import de la DLL de libpng libpng13.dll :

 libpng13.dll Functions Importations : zlib1.dll  Hint/Name Table : 0x33054    TimeDateStamp : 0x0   ForwarderChain : 0x0  First think RVA : 0x330f0 zlib1.dll -> 11.crc32 zlib1.dll -> 12.deflate zlib1.dll -> 15.deflateEnd zlib1.dll -> 16.deflateInit2_ zlib1.dll -> 20.deflateReset zlib1.dll -> 43.inflate zlib1.dll -> 48.inflateEnd zlib1.dll -> 50.inflateInit_ zlib1.dll -> 51.inflateReset KERNEL32.dll  Hint/Name Table : 0x33080    TimeDateStamp : 0x0   ForwarderChain : 0x0  First think RVA : 0x3311c KERNEL32.dll -> 1.AddAtomA KERNEL32.dll -> 175.FindAtomA KERNEL32.dll -> 220.GetAtomNameA msvcrt.dll  Hint/Name Table : 0x33094    TimeDateStamp : 0x0   ForwarderChain : 0x0  First think RVA : 0x33130 msvcrt.dll -> 36.__dllonexit msvcrt.dll -> 152._errno msvcrt.dll -> 384._setjmp msvcrt.dll -> 533.abort msvcrt.dll -> 560.fflush msvcrt.dll -> 566.floor msvcrt.dll -> 574.fread msvcrt.dll -> 575.free msvcrt.dll -> 577.frexp msvcrt.dll -> 583.fwrite msvcrt.dll -> 591.gmtime msvcrt.dll -> 619.ldexp msvcrt.dll -> 625.longjmp msvcrt.dll -> 626.malloc msvcrt.dll -> 632.memcpy msvcrt.dll -> 634.memset msvcrt.dll -> 659.sprintf msvcrt.dll -> 667.strcpy msvcrt.dll -> 671.strlen msvcrt.dll -> 674.strncpy msvcrt.dll -> 679.strtod 

En effet on voit clairement que la msvcrt.dll fourni par défaut par le système est utilisé. C’est bien, mais toujours problématique. Est-ce que la DLL est multithreadé? (google ne m’as pas été d’une grande aide sur ce coup là) ce qui est très important vis-à vit de la nouvelle CRT (msvcrt80.dll)

Transformation (insérer musique de Power Rangers ici)

Un technique en 3 étapes :

  1. On trouve les sources de la dernière libpng sur internet
  2. On compile une nouvelle version de la libpng.dll en faisant super gaffe à quel runtime doit être utilisé. Il doit être identique à celui utilisé dans le projet.
  3. On linke dans la joie et la bonne humeur, youpi le slip et vive les bisounours

Etat final

Grâce à ça on a une libpng.dll avec des imports qui ressemblent un peu plus à quelque chose :

 MSVCR80D.dll  Hint/Name Table : 0x55100    TimeDateStamp : 0x0   ForwarderChain : 0x0  First think RVA : 0x552e8 MSVCR80D.dll -> 569._gmtime64 MSVCR80D.dll -> 95._CRT_RTC_INITW MSVCR80D.dll -> 421._encode_pointer MSVCR80D.dll -> 715._malloc_dbg MSVCR80D.dll -> 422._encoded_null MSVCR80D.dll -> 1316.fflush MSVCR80D.dll -> 410._decode_pointer MSVCR80D.dll -> 117._CrtSetCheckCount MSVCR80D.dll -> 584._initterm MSVCR80D.dll -> 585._initterm_e MSVCR80D.dll -> 330._amsg_exit MSVCR80D.dll -> 314._adjust_fdiv MSVCR80D.dll -> 145.__CppXcptFilter MSVCR80D.dll -> 389._crt_debugger_hook MSVCR80D.dll -> 179.__clean_type_info_names_ MSVCR80D.dll -> 1071._unlock MSVCR80D.dll -> 189.__dllonexit MSVCR80D.dll -> 697._lock MSVCR80D.dll -> 866._onexit MSVCR80D.dll -> 430._except_handler4_common MSVCR80D.dll -> 1344.fwrite MSVCR80D.dll -> 1448.strlen MSVCR80D.dll -> 1459.strtod MSVCR80D.dll -> 1406.pow MSVCR80D.dll -> 1312.fabs MSVCR80D.dll -> 1288.abs MSVCR80D.dll -> 1332.fread MSVCR80D.dll -> 939._setjmp3 MSVCR80D.dll -> 1287.abort MSVCR80D.dll -> 1442.strcpy MSVCR80D.dll -> 1399.memcpy MSVCR80D.dll -> 1333.free MSVCR80D.dll -> 1388.malloc MSVCR80D.dll -> 1387.longjmp MSVCR80D.dll -> 1452.strncpy MSVCR80D.dll -> 1431.sprintf MSVCR80D.dll -> 1403.memset MSVCR80D.dll -> 1398.memcmp MSVCR80D.dll -> 480._free_dbg 
(oui je vous épargne kernel32.dll et la zlib qui est passé en mode debug du coup).

Le dernier doute concerne le mode release, est-ce que ça compilera et surtout s’executera aussi bien? J’ai l’espoir que la technique de recompilation pour utiliser la même CRT fonctionera aussi à ce moment là. En attendant je croise les orteils.

Leave a Reply