[Visual C++ CRT] Wer braucht __initmbctable()?
Verfasst: 10.03.2013, 00:40
Hi,
Auf meinem Feldzug gegen die CRT-Windmühlen kloppe ich mich gerade mit __initmbctable().
(Die Funktion wird bei mir automatisch während des Prozessbeginns ausgeführt. Offenbar ist sie dafür verantwortlich, eine Konvertierungstabelle anzulegen, damit Visual C++ 2012s CRT diese in ihren Multi-Byte-Character-Funktionen verwenden kann. Problematisch ist, dass diese Funktion Thread-Local Storage anfordert, der nicht existiert. Weil ich die CRT nicht initialisiere. Und garnicht initialisieren will.)
Wie finde ich nun raus, wer dafür verantwortlich ist, dass die Funktion bei Prozessbegin ausgeführt wird? Ich binde die CRT statisch ein, und irgendein CRT-Symbol muss ja dafür sorgen, dass der Linker sie nicht als unreferenziert wegschmeißt!
————
Nachtrag: Definiert ist die Funktion in mbctype.c. Dort befindet sich auch:
_CRTALLOC(".CRT$XIC") static _PIFV pinit = __initmbctable;
für alle, denen die Syntax fremd ist: Das sorgt dafür, dass der Linker die Funktion in den Bereich, der für C-Initialisierungsfunktionen vorgesehen ist, einträgt.
Der Punkt ist: Der Linker würde das AFAIK (liege ich hier falsch?) einfach verwerfen, falls nichts aus dieser Übersetzungseinheit referenziert würde. Irgendeine Funktion, die ich benutze, ruft also direkt oder indirekt eine Funktion auf, die ebenfalls in mbctype.c liegt, oder benutzt ein Datensymbol daraus. Wie finde ich raus, wer der Verursacher ist?
Alle CRT-Funktionen, die ich einbinde:
__report_rangecheckfailure
_RTC_CheckStackVars
_RTC_Check_2_to_1
_RTC_Check_4_to_1
_RTC_Check_4_to_2
_RTC_Check_8_to_1
_RTC_Check_8_to_2
_RTC_Check_8_to_4
_RTC_InitBase
_RTC_Shutdown
__GSHandlerCheck
__GSHandlerCheck_EH
__chkstk
__security_cookie
__security_check_cookie
const type_info::`vftable'
_fltused
acos
asin
atan2
cos
exp
log
pow
sin
tan
memmove
memcmp
__CxxFrameHandler3
Noch einer: WTF wird da alles eingebunden?! __isa_available_init()?! „Ööööh sind wir *echt* auf x64“ oder was?! __initstdio()?! Wozu?
Auf meinem Feldzug gegen die CRT-Windmühlen kloppe ich mich gerade mit __initmbctable().
(Die Funktion wird bei mir automatisch während des Prozessbeginns ausgeführt. Offenbar ist sie dafür verantwortlich, eine Konvertierungstabelle anzulegen, damit Visual C++ 2012s CRT diese in ihren Multi-Byte-Character-Funktionen verwenden kann. Problematisch ist, dass diese Funktion Thread-Local Storage anfordert, der nicht existiert. Weil ich die CRT nicht initialisiere. Und garnicht initialisieren will.)
Wie finde ich nun raus, wer dafür verantwortlich ist, dass die Funktion bei Prozessbegin ausgeführt wird? Ich binde die CRT statisch ein, und irgendein CRT-Symbol muss ja dafür sorgen, dass der Linker sie nicht als unreferenziert wegschmeißt!
————
Nachtrag: Definiert ist die Funktion in mbctype.c. Dort befindet sich auch:
_CRTALLOC(".CRT$XIC") static _PIFV pinit = __initmbctable;
für alle, denen die Syntax fremd ist: Das sorgt dafür, dass der Linker die Funktion in den Bereich, der für C-Initialisierungsfunktionen vorgesehen ist, einträgt.
Der Punkt ist: Der Linker würde das AFAIK (liege ich hier falsch?) einfach verwerfen, falls nichts aus dieser Übersetzungseinheit referenziert würde. Irgendeine Funktion, die ich benutze, ruft also direkt oder indirekt eine Funktion auf, die ebenfalls in mbctype.c liegt, oder benutzt ein Datensymbol daraus. Wie finde ich raus, wer der Verursacher ist?
Alle CRT-Funktionen, die ich einbinde:
__report_rangecheckfailure
_RTC_CheckStackVars
_RTC_Check_2_to_1
_RTC_Check_4_to_1
_RTC_Check_4_to_2
_RTC_Check_8_to_1
_RTC_Check_8_to_2
_RTC_Check_8_to_4
_RTC_InitBase
_RTC_Shutdown
__GSHandlerCheck
__GSHandlerCheck_EH
__chkstk
__security_cookie
__security_check_cookie
const type_info::`vftable'
_fltused
acos
asin
atan2
cos
exp
log
pow
sin
tan
memmove
memcmp
__CxxFrameHandler3
Noch einer: WTF wird da alles eingebunden?! __isa_available_init()?! „Ööööh sind wir *echt* auf x64“ oder was?! __initstdio()?! Wozu?