• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[C++] Der Linker linkt falsch

florian0

Neu angemeldet

Registriert
3 Okt. 2013
Beiträge
4
Ort
Frankfurt a.M.
Hiho,

ich möchte in einer C++ Anwendung eine DLL verwenden. Diese DLL exportiert Klassen. Zur DLL existiert kein offizelles Lib-File für den Linker.
(Es handelt sich eine modifizierte Version von Ogre3D (OgreMain.dll) )

Ich habe nach dieser Anleitung ein Lib-File erstellt. Die spezifischen Klassen, die ich verwenden wollte, habe ich per Header definiert. Die restlichen Header habe ich aus dem OgreSDK gezogen. Sollte also erstmal kein Problem darstellen.

Der Compilier kompiliert das Programm und der Linker linkt brav. Doch einige Funktionen einer bestimmen Klasse sind falsch gelinkt. Schaut man sich das ganze auf Assembler-Ebene an, so stellt man fest, das die Funktionspointer um 4 Byte falsch berechnet werden. (Berechneter Pointer + 4 = Richtiger Pointer).
(Die Pointer sind ja als Liste einkompiliert. Ab einem bestimmen Punkt mitten in der Liste sind alle darauf folgenden Pointer um 4 Byte verschoben. So wie als würde da ein Eintrag zu viel sein ...).
(Edit: Evtl. etwas schwammig formuliert. Nicht der Pointer auf die Funktion selbst ist verschoben, sondern der Index auf die Liste. Daher wird immer die nächste Funktion gelinkt, statt die Richtige)

Ist für mich totales Neuland. Mein C++ war nie sonderlich gut und mein Wissen über den Linker ist sehr begrenzt. Keine Ahnung was da abgeht. Woran kann das liegen? Ich hab ne Menge Linker-Warnings bezüglich anderer Funktionen aus den OgreHeadern. Kann das damit zusammenhängen? Das sich der Linker da verrechnet?


Ich hab mir jetzt beholfen, in dem ich eine Wrapper-Klasse geschrieben habe. Diese führt den wohl kränksten Cast meines Lebens aus, um die Funktionen richtig zu mappen. Aber das kann ja wohl nicht die Lösung sein ...


Ich bin für jede noch so doofe Idee dankbar. Ich hab nämlich keine eigenen mehr.
Ich weiß nicht mal nach was ich suchen könnte.
Vielleicht hat jemand auch eine anschauliche Referenz zum Linker. Ich hab mir ein paar Bücher aus der Bibliothek geholt, aber die sind echt schwere Kost.

Windows 7 (32) + Visual Studio 2010 + WinSDK 7.1
OgreSDK 1.8
Kein CLR/ATL/MFC

(Falls jemand am genauen Hintergrund interessiert ist: Ich möchte die Archivdateien eines Spiels entpacken. Das Spiel ist in Ogre3D geschrieben und liefert eine DLL mit den entsprechenden Exports. Die nötigsten Funktionen funktionieren auch, aber das oben genannte Phänomen bereitet mir Kopfschmerzen).

Gruß
florian0
 
Zuletzt bearbeitet:

Kenobi van Gin

Brillenschlange

Registriert
14 Juli 2013
Beiträge
3.620
Ort
.\
Ich hab selbst keine Ahnung.
Aber in Anbetracht der verstrichenen Zeit seit deinem Initial Post ohne jeglich Reaktion seitens der Community, würde ich mal den Kugelfisch anschreiben und lieb fragen, ob er ne Idee hat.
Weiß nicht, wie bewandert der so in C++ ist, aber ich hab ihn bisher nur mit kompetenten Antworten erlebt.
 

Exterminans

Neu angemeldet

Registriert
14 Juli 2013
Beiträge
147
Du musst die Ausgabe von dumpbin /exports noch nach der Ordinal-Spalte sortieren. Das dumpbin-Tool sortiert die Symbole alphabetisch, um korrekt linken zu können müssen die Symbole allerdings nach dem Ordinal-Wert sortiert sein.

Es ist außerdem möglich dass nicht alle Ordinal-Werte belegt sind!

Aus diesem Grund, anstelle von:
[src=asm]EXPORTS
jcopy_block_row
jcopy_sample_rows
jdiv_round_up
jinit_1pass_quantizer
jinit_2pass_quantizer
jinit_c_coef_controller
...[/src]
Schreibst du
[src=asm]
EXPORTS
jcopy_block_row @1
jcopy_sample_rows @2
jdiv_round_up @3
...[/src]
wobei du die Zahl mit dem Ordinalwert ersetzt. Damit kann das lib-Tool dann auch mit Lücken / falscher Reihenfolge korrekt umgehen.
 
Zuletzt bearbeitet:

Larius

OutOfOrder

Registriert
12 Juli 2013
Beiträge
5.792
Sprich das war gar nicht mal ein "Der Funktionspointer zeigt auf den falschen Eintrag" sondern ein "Der Funktionspointer zeigt zwar auf die richtige Stelle, allerdings ist der Eintrag nicht an der richtigen Stelle wg. falscher Sortierung, weshalb es so vor kommt als würde er falsch hinzeigen"? Interessant, das Verhalten ist mir neu.
 

florian0

Neu angemeldet

Registriert
3 Okt. 2013
Beiträge
4
Ort
Frankfurt a.M.
  • Thread Starter Thread Starter
  • #5
Hi,

@Exterminans:
Danke, für den Tipp. Es funktioniert zwar immer noch nicht (:D), aber es hat mich auf eine andere Spur gebracht:

Ich habe eine minimalistische .def-Datei mit nur den nötigsten Exports erstellt (mit angegeben Ordinalwerten) und siehe da: Die "falsch" gelinkten Funktionen werden gar nicht vom Linker behandelt. Ich habe die betroffenen Funktionen nicht in der def-Datei (und folglich auch nicht in der lib-Datei) angegeben.

Also noch mal genauer hingesehen: Der Aufruf geht über die vftable direkt in die DLL. Nur warum auf den falschen Eintrag? Falsch geerbt?

Gruß
florian0
 
Oben