From: Dock, D. <dio...@me...> - 2011-03-11 01:34:31
|
From: Dongsheng Song [mailto:don...@gm...] Sent: Wednesday, March 09, 2011 6:17 PM To: Dock, Dion; Kai Tietz Cc: min...@li... Subject: Re: [Mingw-w64-public] why aren't "secure" _s functions provided? On Thu, Mar 10, 2011 at 09:07, Dock, Dion <dio...@me...> wrote: How did you do that? nm isn't displaying those functions in my preferred runtime lib, libmsvcr80.a. For example, C:\Temp>C:\mingw_32\bin\i686-w64-mingw32-nm.exe C:\mingw_32\mingw\lib\libmsvcr80.a | find "strcpy_s" C:\Temp> You can use gendef [1, 2] to generate .def file from .dll file. [1] https://mingw-w64.svn.sourceforge.net/svnroot/mingw-w64/trunk/mingw-w64-tools/gendef [2] http://i18n-zh.googlecode.com/files/gendef-r3706.exe Thanks! Adding the "-lmsvcr80" resolved a few of the symbols. Now I've hit the next stumbling block: vsnprintf_s and localtime32_s. These don't seem to be in libmsvcr80.a, but per the above, I'm not sure how to check for their presence. Neither is a macro, however. In msvcr80.dll, here is thess function names list: _localtime32_s _vsnprintf_s _vsnprintf_s_l strcpy_s So you must use vsnprintf_s and localtime32_s with prefix '_', as ms vc declared: _CRTIMP errno_t __cdecl _localtime32_s(_Out_ struct tm *_Tm, _In_ const __time32_t * _Time); _Check_return_opt_ _CRTIMP_ALTERNATIVE int __cdecl _vsnprintf_s(_Out_z_cap_(_SizeInBytes) char * _DstBuf, _In_ size_t _SizeInBytes, _In_ size_t _MaxCount, _In_z_ _Printf_format_string_ const char * _Format, va_list _ArgList); But in the w64 repository, no such symbols: $ grep -E "vsnprintf|localtime" msvcr80.def _vsnprintf localtime DATA ;_localtime32 = localtime _localtime64 So you must add these symbols yourself, then rebuild libmsvcr80.a; or you can simply copy msvcr80.dll to libmsvcr80.a. @Kai, could you rebuild msvcr*.def from msvcr*.dll ? -- Dongsheng I'm still flailing around with this. C:\Temp>more dion.c #include <stdio.h> #include <time.h> int main() { struct tm aTm; int err = 0; __time32_t time; _time32(&time); err = _localtime32_s(&aTm, &time); return 0; } DION: defaults don't work C:\Temp>C:\mingw_32\bin\i686-w64-mingw32-gcc.exe dion.c C:\Users\dockd\AppData\Local\Temp\ccoRa8Cv.o:dion.c:(.text+0x3a): undefined reference to `_localtime32_s' collect2: ld returned 1 exit status DION: try the VS 2005 version of the C runtime C:\Temp>C:\mingw_32\bin\i686-w64-mingw32-gcc.exe dion.c -lmsvcr80 C:\Users\dockd\AppData\Local\Temp\cckwwBoL.o:dion.c:(.text+0x3a): undefined reference to `_localtime32_s' collect2: ld returned 1 exit status DION: try creating my own version of the C runtime C:\Temp>C:\mingw_32\bin\i686-w64-mingw32-dlltool.exe -D "C:\Program Files (x86)\ Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\msvcr80.dll" -d msvcr80.def -l libmsvcr80.a C:\mingw_32\bin\i686-w64-mingw32-dlltool.exe: Path components stripped from dllname, 'C:\Program Files (x86)\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\msvcm80.dll'. C:\Temp>C:\mingw_32\bin\i686-w64-mingw32-gcc.exe dion.c libmsvcr80.a c:/mingw_32/bin/../lib/gcc/i686-w64-mingw32/4.5.2/../../../../i686-w64-mingw32/lib/libmingw32.a(lib32_libmingw32_a-mingw_helpers.o): In function `encode_pointer': c:\bb\vista64-mingw32\mingw-x86-x86\build\build\mingw\obj/../../../build/mingw/mingw-w64-crt/crt/mingw_helpers.c:26: multiple definition of `_encode_pointer' libmsvcr80.a(dqmlfs00370.o):(.text+0x0): first defined here collect2: ld returned 1 exit status suggestions? -Dion |