Daniel Albuschat
2013-Dec-08 18:02 UTC
[LLVMdev] Win32: Crash in DLL created by llvm that calls into the "putchar" function
Hey Jeremy, (putting the discussion back to the list.) 2013/12/8 Jeremy Lakeman <Jeremy.Lakeman at gmail.com>:> If I run your demo exe it crashes, if I re-link the dll with VS 2010 it > errors gracefully; > > runtime error R6030 > - CRT not initialized > > putchar is a c runtime function. > I'm betting that your exe doesn't initialise the runtime library?You're right, this is surely the problem then. Thanks a buch for that pointer. However, after quite much googling, I can't find a way to correctly initialize the CRT in a DLL created from llvm.>From what I've learned, the system works as follows:* The entry point for DLLs in __DllMainCRTStartup at 12. * The CRT libraries provide an implementation for this function in libcmt.lib. * That implementation initializes the CRT (afaik using CRT_INIT) and calls DllMain. The question that remains is how to dllexport a function that is defined in a separate library? Greetings, Daniel Albuschat
Daniel Albuschat
2013-Dec-08 18:10 UTC
[LLVMdev] Win32: Crash in DLL created by llvm that calls into the "putchar" function
2013/12/8 Daniel Albuschat <d.albuschat at gmail.com>:> Hey Jeremy, > > (putting the discussion back to the list.) > > 2013/12/8 Jeremy Lakeman <Jeremy.Lakeman at gmail.com>: >> If I run your demo exe it crashes, if I re-link the dll with VS 2010 it >> errors gracefully; >> >> runtime error R6030 >> - CRT not initialized >> >> putchar is a c runtime function. >> I'm betting that your exe doesn't initialise the runtime library? > > You're right, this is surely the problem then. Thanks a buch for that pointer. > However, after quite much googling, I can't find a way to correctly > initialize the CRT in a DLL created from llvm. > From what I've learned, the system works as follows: > > * The entry point for DLLs in __DllMainCRTStartup at 12. > * The CRT libraries provide an implementation for this function in libcmt.lib. > * That implementation initializes the CRT (afaik using CRT_INIT) and > calls DllMain. > > The question that remains is how to dllexport a function that is > defined in a separate library?Actually, I answered that question just a few seconds later. ;-) I just forgot to pass LIBCMT.LIB to link.exe in my previous tries. Here's the working .ll file that can be used to create a .dll that calls into the putchar function:> cat callPutchar.ll; ModuleID = 'test' declare i32 @putchar(i32) declare x86_stdcallcc i8 @DllMainCRTStartup(i32*, i32, i32*) define dllexport i32 @main() { __entry__: %0 = call i32 @putchar(i32 79) ret i32 %0 } define dllexport x86_stdcallcc i8 @DllMain(i32*, i32, i32*) { ret i8 1 }> llc -filetype obj callPutchar.ll> link /DLL /SUBSYSTEM:CONSOLE callPutchar.obj LIBCMT.LIBMicrosoft (R) Incremental Linker Version 12.00.21005.1 Copyright (C) Microsoft Corporation. All rights reserved. Bibliothek "callPutchar.lib" und Objekt "callPutchar.exp" werden erstellt. d:\callPutchar>demoDllCaller.exe O YAY! Thanks again, Jeremy. Daniel
Reasonably Related Threads
- [LLVMdev] Win32: Crash in DLL created by llvm that calls into the "putchar" function
- [LLVMdev] Current state of the lld project
- [LLVMdev] Current state of the lld project
- [LLVMdev] lld fails to build on Visual Studio 2013
- [LLVMdev] Disabling optimizations when using llvm::createPrintModulePass