Assembler und .SAFESEH

Wenn in einem 32-bit Windows MSVC Build der Fehler

fatal error LNK1281: Unable to generate SAFESEH image

auftaucht, liegt es vermutlich an einem fehlenden Exception-Handler in einem Assembler Modul.


In der C und C++ Welt übernimmt der Compiler den Job, für alle Module Exception Handler zu generieren, wenn es notwendig ist. Und der Linker fügt dann alle diese “kompatiblen” Handler in die finale Binärdatei zusammen.

Doch Assembler Module dürfen sich “anders” Verhalten, und wenn man dort nur seinen Code schreibt, fehlt ein solcher Handler, womit sich dieses Modul von den anderen C/C++ Modulen unterscheidet.

Und das führt zum oben genannten Fehler.

Jetzt kann man entweder die Notwendigkeit von “Safe Exception Handlers” deaktivieren
(Project Properties - Linker - Advanced - Image Has Safe Exception Handlers) oder auch mit der Compiler Option /SAFESEH:NO.

Oder man fügt dem .asm Modul eine leere SEH-Funktion hinzu und registriert sie mit der .safeseh Direktive.

 1;my_asmcode.asm
 2.386
 3.MODEL FLAT, C
 4
 5.CODE
 6
 7.SAFESEH my_seh_handler
 8my_seh_handler PROC
 9  ret
10my_seh_handler ENDP
11
12
13my_real_operative_asm_proc PROC
14...

Natürlich muss man jetzt die .asm Datei auch mit der /safeseh Option kompilieren lassen.
(ASM File Properties - Microsoft Macro Assembler - Advanced - Use Safe Exception Handler)

Wenn man mit CMAKE arbeitet, hilft einem der Eintrag:

1set_source_files_properties(
2  my_asmcode.asm
3  PROPERTIES
4  COMPILE_FLAGS "/safeseh"
5)

Fazit

Wenn man ein Projekt mit vielen Optionen auf vielen Plattformen kompilieren will, vergisst man leider immer wieder, ein paar dieser Optionen und Options-Kombinationen zu testen.

Langsam wird es Zeit, dass ich mir jetzt richtige Build-Server für alle meine Plattformen aufsetze, denn wegen der vielen Möglichkeiten vergesse ich zunehmend immer alles auszutesten und “auf Stand” zu halten.
Und dann wundert man sich plötzlich, wenn etwas nicht mehr baut und merkt erst dann mit Schrecken, dass es schon ein halbes Jahr nicht mehr funktioniert.

Und genau das sollte eine Buildserverumgebung automatisiert erfassen und melden können.

Alexa, füge einen Buildserver zu meiner Einkaufsliste hinzu.