🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.lang.c++
4 messages
4 total messages Started by Mike Schreier Mon, 18 Dec 1995 10:04
HILFE: Probleme beim Linken mit mit WATCOM
#1026
Author: Mike Schreier
Date: Mon, 18 Dec 1995 10:04
58 lines
2268 bytes
Hi,
 ich habe einige Probleme beim Konvertieren meiner Programme von Borland C++
nach Watcom C++. Besonders beim Liken von Assembler und C++ Moduln. 
Ein Beispiel [tut nichts, zeigt nur das Problem] :

C++ : *********************************************************************
	int VT;
	extern "C" ASM_Test (void);
	void main (void)
	        {
	        ASM_Test ();
	        }

Assembler : ***************************************************************
	.386
	.model flat

	.code
	extrn VT:dword	 	         ; THIS DOES'NT WORK !!!!!!!!!!!!!!!!!!
					 ; THE LINKER DOES'NT FOUND !!!!!!!!!!!
	public ASM_Test_
	ASM_Test_ proc 
	        push ecx
	        push ebp
	        mov  ebp,esp
	
	        xor  ecx,ecx
	        inc  cx
	        mov  eax,VT
        
	        mov  esp,ebp
	        pop  ebp
	        pop  ecx        
	        ret
	ASM_Test_ endp
	end
*******************************************************************************
And that is what happens :

wmake -f d:\watcom\programs\vesa\v16.mk -h -e
wasm test.asm -i=d:\WATCOM\h -mf -5r -w4 -e25 -zq
wpp386 ..\go.cpp -i=d:\WATCOM\h -w4 -e25 -zq -otexan -d2 -5r -bt=dos -mf
wlink d all SYS dos4g op m op c op maxe=25 op q op symf @v16.lk1
file test.obj(test.asm): undefined symbol VT
Error(E42): Last command making (d:\watcom\programs\vesa\v16.exe) returned a bad status
Error(E02): Make execution terminated
Execution complete


NUN das Problem : WARUM FINDET DER LINKER DIE IM C++ MODUL DEKLARIERTE VARIABLE 'VT' IM
ASSEMBLERMODUL NICHT ???????????????? Unter BC funktioniert das ganze!

Wenn jemand Rat weiss, dann immer her damit! Vielen Dank im Voraus!


								          mis

						mis@informatik.tu-chemnitz.de
Re: HILFE: Probleme beim Linken mit mit WATCOM
#1031
Author: Ullrich von Bassewitz
Date: Mon, 18 Dec 1995 13:42
23 lines
1371 bytes
Mike Schreier (mis@informatik.tu-chemnitz.de) wrote:
> NUN das Problem : WARUM FINDET DER LINKER DIE IM C++ MODUL DEKLARIERTE VARIABLE 'VT' IM
> ASSEMBLERMODUL NICHT ???????????????? Unter BC funktioniert das ganze!

Arghh! Schrei nicht so...

Loesung: Erstens ist der von Dir angegebene Name fuer VT falsch (underline
fehlt), zweitens betreibt WCC auf bei Variablen-Namen Name-Mangling, d.h. Du
solltest die Variable auch als extern "C" deklarieren.

Ausserdem ist nochmal ein Fehler/Unzulaenglichkeit in Deinem Code: Du
solltest vorsichtshalber externe Assembler-Funktionen als __cdecl markieren.
Nur dann hast Du eine genau definierte Aufrufkonvention, die unabhaengig von
irgendwelchen Compilerswitches sind (und die zudem kompatibel mit anderen
Compilern sind, d.h. Dein Assembler-Code wird portierbarer).

Gruss


        Uz

-- 
Ullrich von Bassewitz                              uz@ibb.schwaben.com
Re: HILFE: Probleme beim Linken mit mit WATCOM
#1034
Author: Vitalik Polowinkin
Date: Mon, 18 Dec 1995 18:32
94 lines
3326 bytes
Tag, Mike !

-=> Quotes a message (4b3ebt$goc@pyrrhus-f.hrz.tu-chemnitz.de) in /de/comp/lang/c++
-=> from mis to  at 18.12.95 10:04

>  ich habe einige Probleme beim Konvertieren meiner Programme von Borland
> C++ nach Watcom C++. Besonders beim Liken von Assembler und C++ Moduln.
> Ein Beispiel [tut nichts, zeigt nur das Problem] :


> C++ : ********************************************************************
> * 	int VT;
> 	extern "C" ASM_Test (void);

  mit 'extern "C"' muessen nicht nur Funktionen, sondern auch alle  
Variablen deklariert werden, die mit den nicht-C++ Modulen gelinkt werden  
muessen, also ein 'extern "C" VT' sollte es sein.


> 	void main (void)
> 	        {
> 	        ASM_Test ();
> 	        }
>
> Assembler : **************************************************************
> * 	.386
> 	.model flat
>
> 	.code
> 	extrn VT:dword	 	         ; THIS DOES'NT WORK !!!!!!!!!!!!!!!!!!
> 					 ; THE LINKER DOES'NT FOUND !!!!!!!!!!!

  Versuch's mit 'extern _VT:dword'

> 	public ASM_Test_
> 	ASM_Test_ proc
> 	        push ecx
> 	        push ebp

> 	        mov  esp,ebp
> 	        pop  ebp
> 	        pop  ecx
> 	        ret
> 	ASM_Test_ endp
> 	end

  Falls Du spaeter die Argumente in Deine ASM-Routine uebergeben moechtest,  
vergiss nicht, dass defaultmaessig die register call conventions wirksam  
sind. Falls Du es bequemer (stack call convention) haben moechtest - '/4r'  
oder '/5r' -Kommandozeilenoption angeben oder die ASM_Test-Deklaration in  
C++ source mit '__cdecl' versehen.



> **************************************************************************
> ***** And that is what happens :
>
> wmake -f d:\watcom\programs\vesa\v16.mk -h -e
> wasm test.asm -i=d:\WATCOM\h -mf -5r -w4 -e25 -zq
> wpp386 ..\go.cpp -i=d:\WATCOM\h -w4 -e25 -zq -otexan -d2 -5r -bt=dos -mf
> wlink d all SYS dos4g op m op c op maxe=25 op q op symf @v16.lk1
> file test.obj(test.asm): undefined symbol VT
> Error(E42): Last command making (d:\watcom\programs\vesa\v16.exe) returned
> a bad status Error(E02): Make execution terminated
> Execution complete
>
>
> NUN das Problem : WARUM FINDET DER LINKER DIE IM C++ MODUL DEKLARIERTE
> VARIABLE 'VT' IM ASSEMBLERMODUL NICHT ???????????????? Unter BC
> funktioniert das ganze!

    Weil die Regeln, nach denen die source-Namen fuer den Linker ergaenzt  
werden, bei jedem Compiler anders sind.


   Ein guter Tip: schau in die vom Linker erzeugte Map-Datei rein. 'OPTION  
MAP', evtl. 'OPTION VERBOSE' aktivieren es. Suche nach Deinen Namen, wo er  
definiert (public) und wo er deklariert (extern) ist - vieles wird auf  
einmal klarer.  Der Disassembler (wdisasm) kann auch oft helfen.




> Wenn jemand Rat weiss, dann immer her damit! Vielen Dank im Voraus!

  -hiermit geschehen


> 								          mis
>
> 						mis@informatik.tu-chemnitz.de

Ciao.
Vitalij.
Re: HILFE: Probleme beim Linken mit mit WATCOM
#1076
Author: Claus Faerber
Date: Wed, 20 Dec 1995 18:34
37 lines
1913 bytes
mis@informatik.tu-chemnitz.de (18 Dec 95):

> Hi,
>  ich habe einige Probleme beim Konvertieren meiner Programme von Borland C++
> nach Watcom C++. Besonders beim Liken von Assembler und C++ Moduln.
> Ein Beispiel [tut nichts, zeigt nur das Problem] :
>
> C++ : *********************************************************************

>       int VT;
versuch's mal hier mit:
        extern "C" int VT;

[[...]]
> Assembler : ***************************************************************
[[...]]
>       extrn VT:dword          ; THIS DOES'NT WORK !!!!!!!!!!!!!!!!!!
>                               ; THE LINKER DOES'NT FOUND !!!!!!!!!!!
[[...]]

> NUN das Problem : WARUM FINDET DER LINKER DIE IM C++ MODUL DEKLARIERTE
> VARIABLE 'VT' IM ASSEMBLERMODUL NICHT ???????????????? Unter BC funktioniert
> das ganze!

Scheinbar erweitert Watcom den Variablennamen um den Variablentyp ("name- 
mangling"). Somit stimmen die Namen von Asm- und Cpp-Modul nicht mehr  
ueberein. extern "C" sagt dem Compiler, C-Namen zu verwenden, bei denen kain  
Name-Mangling zum Einsatz kommt.

Was mir aufgefallen ist: setzen 32-Bit-C++-Compiler keinen "_" mehr vor  
Variablen und Funktionsnamen??
Sonst muesstest Du naemlich das auch noch im Asm-Modul beruecksichtigen.

===========================================================================
 Claus Andre Faerber                                <claus@faerber.muc.de>
 Mitterfeldstrasse 20 * D-83043 Bad Aibling * Germany * fax: +49-8061-2057
===========================================================================
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads