Kann jemand Namen in Visual C ++ manuell ändern?

8

Wenn ich eine Funktion in einem .c wie

habe %Vor%

... in meinem .obj wird dies ein Symbol mit dem Namen

%Vor%

... gemäß den C-Namen-Mangling-Regeln. Wenn ich eine ähnliche Funktion in einer CPP-Datei habe, wird dies etwas ganz anderes, wie bei den compilerspezifischen Regeln für die Namensänderung. msvc 12 gibt uns folgendes:

%Vor%

Wenn ich diese Funktion foo in der .cpp-Datei habe und ich möchte, dass sie C-name-Mangling-Regeln verwendet (vorausgesetzt, ich kann ohne Überladung auskommen), können wir sie als

deklarieren %Vor%

... in diesem Fall sind wir wieder bei guten alten

%Vor%

... in der .obj-Symboltabelle.

Meine Frage ist, ist es möglich, anders herum zu gehen? Wenn ich C ++ - Namen-Mangling mit einer C-Funktion simulieren wollte, wäre dies mit gcc einfach, da die gcc-Namensveränderungsregeln nur identifierfreundliche Zeichen verwenden, daher wird der verstümmelte Name von foo _ZN3fooEic und wir könnten leicht

%Vor%

Zurück im Microsoft-Compiler-Land, kann ich natürlich keine Funktion erstellen, deren Name eine vollständig ungültige Kennung namens

ist %Vor%

... aber ich möchte immer noch, dass diese Funktion mit diesem Symbolnamen in der OBJ-Symboltabelle angezeigt wird.

Irgendwelche Ideen? Ich habe die unterstützten Pragmas von Visual C ++ durchgesehen, und ich sehe nichts Nützliches.

    
Ted Middleton 07.03.2016, 06:43
quelle

3 Antworten

5

Sie können dies mit __identifier tun:

%Vor%     
James McNellis 08.03.2016, 19:34
quelle
7

Sie haben Recht. Das ist nicht (direkt) möglich (Achtung: vertraue VSC ++ nie). Es gibt jedoch eine nette Problemumgehung, wenn Sie dies wirklich benötigen. Zuallererst, in der C ++ Datei ...

%Vor%

Dann in der C-Datei ...

%Vor%

Ohne einen fehlenden Namen eingeben zu müssen, können Sie nun die Funktion foo aufrufen, die eigentlich nur ein Wrapper um die C-Funktion proxy ist. Dies gibt Ihnen den gleichen Effekt, als wäre proxy tatsächlich foo , aus der Sicht von C ++. Die einzige Strafe hier ist natürlich ein kurzer 'n' schmutziger Funktionsaufruf. Wenn der ABI dies zulässt und der Compiler intelligent genug ist, kann dies durch eine einzige JMP x86-Anweisung ersetzt werden.

Ein anderer Weg wäre, eine Funktion foo in C zu schreiben und dann MinGWs objcopy zu verwenden, um das Symbol umzubenennen ...

%Vor%

Ich bin nicht sicher, ob das nur mit VSC ++ Tools möglich ist. Es wäre sowieso sehr instabil, unportabel und hacky.

    
3442 07.03.2016 06:51
quelle
6

Sie können es mithilfe einer DEF-Datei zum Funktionieren bringen. Definieren Sie Ihre Funktion in Ihrem foo.cpp :

%Vor%

Übergeben Sie dann eine def-Datei an den Linker, die wie folgt aussieht:

%Vor%

Haftungsausschluss: ungeprüft, mir fehlen vielleicht einige Details.

    
sbabbi 07.03.2016 09:34
quelle

Tags und Links