Thread View: comp.sys.ibm.pc.programmer
10 messages
10 total messages
Started by Bret Johnson
Sun, 03 Jun 1990 20:45
Using Turbo C with libraries compiled with Microsoft C
Author: Bret Johnson
Date: Sun, 03 Jun 1990 20:45
Date: Sun, 03 Jun 1990 20:45
12 lines
1102 bytes
1102 bytes
I am considering buying Turbo C++, but I need to link to a library that is compiled with Microsoft C. Specifically, I need to link to the C interface library packaged with the KnowledgeMan database system. (This library is called TBL; it used to be called KC.) As I understand, Turbo C, and thus I assume Turbo C++, sometimes works with libraries compiled with Microsoft C and sometimes does't. Could anyone please report their experiences using Turbo C with libraries compiled with Microsoft C. Are there any rules as to when things work and when they don't? Thank you. Bret Johnson johnson@cs.purdue.edu
Re: Using Turbo C with libraries compiled with Microsoft C
Author: thomas.j.roberts
Date: Mon, 04 Jun 1990 20:58
Date: Mon, 04 Jun 1990 20:58
43 lines
2486 bytes
2486 bytes
There are several (many ?) differences between Turbo C and Microsoft C. Some of them are harmless, some will kill your program; some will kill MS-DOS, some might even trash your disk(s). THIS IS PROBABLY NOT A COMPLETE LIST! 1) TC returns 4-byte results in AX/DX; MC uses AX/BX (float/double are returned in 8087 Top-Of-Stack register). This will make any large-pointer function misbehave dangerously, and will give erroneous results from any long function. 2) TC and MC use different names for the various segments. This will probably prevent it from linking properly (except for huge model programs), and will cause subtle errors in a huge-model program. 3) TC and MC package library routines differently, so you cannot use both the MC and the TC run-time libraries. If the third-party library depends upon the MC run-time library, this may cause link and/or run-time problems. 4) TC and MC have different requirements for subroutines to preserve register contents. This will cause a serious disaster during execution (write-protect those disks before executing!). 5) The TC run-time library screws around with the console hardware (even if you don't call any of its TEXT or GRAPHICS routines); this can often be minimized by setting directvideo=0. In most cases, even if you manage to get the linker to link the program and libraries without error, it will still die a horrible death when executed (usually taking MS-DOS down, too). In short, I strongly advise against trying to mix compilers in the same program. If you simply cannot afford to buy the other compiler, then you probably can make it work with the following kludges: 1) use TC huge model, and MC large model. 2) wrap every MC library routine with a special assembly routine to satisfy BOTH TC and MC register conventions (MC routine calling MC routine is probably OK as is). This special routine will need to manage DS. Good luck [you will really need it!]. Tom Roberts att!ihlpl!tjrob
Re: Using Turbo C with libraries compiled with Microsoft C
Author: Doug McDonald
Date: Tue, 05 Jun 1990 13:41
Date: Tue, 05 Jun 1990 13:41
11 lines
942 bytes
942 bytes
In article <1990Jun4.205834.13661@cbnewsc.att.com> tjr@cbnewsc.att.com (thomas.j.roberts) writes: >There are several (many ?) differences between Turbo C and Microsoft C. > >1) TC returns 4-byte results in AX/DX; This I have no idea about. > MC uses AX/BX WRONG!!! Microscoft C uses AX/DX Doug McDonald
Re: Using Turbo C with libraries compiled with Microsoft C
Author: David Hinds
Date: Tue, 05 Jun 1990 19:15
Date: Tue, 05 Jun 1990 19:15
28 lines
2009 bytes
2009 bytes
In article <1990Jun4.205834.13661@cbnewsc.att.com> tjr@cbnewsc.att.com (thomas.j.roberts) writes:
>There are several (many ?) differences between Turbo C and Microsoft C.
>Some of them are harmless, some will kill your program; some will kill
>MS-DOS, some might even trash your disk(s).
>
>2) TC and MC use different names for the various segments.
>3) TC and MC package library routines differently.
>4) TC and MC have different requirements for subroutines to preserve
> register contents.
>5) The TC run-time library screws around with the console hardware
>
>In short, I strongly advise against trying to mix compilers in the same
>program. If you simply cannot afford to buy the other compiler, then
>you probably can make it work with the following kludges...
>
This sounds like an appropriate place to mention some of the benefits
of the Topspeed C compiler vs. Microsoft or Turbo C. The topspeed compiler
allows you to specify just about anything having to do with calling
conventions on the fly - segment names, parameter passing in registers,
stack frame layout, inline function expansion, and register preservation.
And you can recompile the run-time libraries to use whatever calling
conventions you like. So, you can generally use most 3rd party libraries,
regardless of what compiler they were generated with, if you know its
calling conventions. You just add some compiler directives to the header
files.
-David Hinds
dhinds@popserver.stanford.edu
Re: Using Turbo C with libraries compiled with Microsoft C
Author: William C. Marsh
Date: Tue, 05 Jun 1990 19:47
Date: Tue, 05 Jun 1990 19:47
39 lines
2167 bytes
2167 bytes
Just thought I'd correct a few things, but mostly Tom's comments are
correct:
In article <1990Jun4.205834.13661@cbnewsc.att.com> tjr@cbnewsc.att.com (thomas.j.roberts) writes:
>1) TC returns 4-byte results in AX/DX; MC uses AX/BX (float/double
> are returned in 8087 Top-Of-Stack register).
Wrong. Both use DX:AX for longs, far pointers, etc. I don't know about
floats.
>4) TC and MC have different requirements for subroutines to preserve
> register contents. This will cause a serious disaster during
Both have requirements to save BP, SI, and DI (and DS!). All others are
fair game for both compilers.
>5) The TC run-time library screws around with the console hardware
> (even if you don't call any of its TEXT or GRAPHICS routines);
> this can often be minimized by setting directvideo=0.
Shouldn't matter to a third party routine, since Microsoft doesn't mess
about with the hardware, and the library would have to deal with it
anyway.
>In most cases, even if you manage to get the linker to link the program
>and libraries without error, it will still die a horrible death when
>executed (usually taking MS-DOS down, too).
Probably. It's probably the segments (and groups) that are going to kill
you, also with internal functions (like long variable manipulation stuff)
that would be called in the third party library which are not in the TC
library.
Bill
--
Bill Marsh, Naval Ocean Systems Center, San Diego, CA
{arpa,mil}net: bmarsh@cod.nosc.mil
uucp: {ihnp4,akgua,decvax,dcdwest,ucbvax}!sdcsvax!nosc!bmarsh
"If everything seems to be coming your way, you're probably in the wrong lane."
Re: Using Turbo C with libraries compiled with Microsoft C
Author: Walter Bright
Date: Wed, 06 Jun 1990 02:17
Date: Wed, 06 Jun 1990 02:17
42 lines
2701 bytes
2701 bytes
In article <1990Jun5.134159.9577@ux1.cso.uiuc.edu> mcdonald@aries.scs.uiuc.edu (Doug McDonald) writes: <In article <1990Jun4.205834.13661@cbnewsc.att.com> tjr@cbnewsc.att.com (thomas.j.roberts) writes: <<There are several (many ?) differences between Turbo C and Microsoft C. <<1) TC returns 4-byte results in AX/DX; <This I have no idea about. << MC uses AX/BX <WRONG!!! Microscoft C uses AX/DX Zortech also uses AX/DX. In fact, Zortech follows exactly MSC's segment conventions, register saved/destroyed conventions, return value conventions (including struct returns), Pascal conventions, etc. The only difference is in floating point returns, ZTC's is different in order to make it reentrant. This is not enough, however, to make a 3rd party MSC library work with ZTC. Trouble areas are: 1. Using floating point. 2. Depending on 'compiler helper' functions in the rtl, like long divide. 3. Depending on the exact size and layout of the _iob[] struct in stdio.h (they're different between most compilers). This can cause very subtle crashes. 4. Using undocumented internal MSC library functions. 5. Depending on non-standard behavior of library functions (like strange things in printf format strings). This is not to say it's impossible. For example, ZTC programs can use the Microsoft Windows SDK libraries and the OS/2 PM libraries. This works because I made it work. It's just that you can't casually do this. Sometimes, people try and make things work by linking in *both* the MSC runtime libraries and the ZTC runtime libraries. This is nearly always doomed to failure, the usual result is lots of multiply-defined symbols from the linker. Even if it linked successfully, just imagine what would happen when you get some modules thinking _iob[] has one layout talking to other modules thinking something else... not a pretty thing to do to your hard disk! In other words, the most practical courses of action are: 1. Only buy libraries that come with source, and recompile it for the compiler you're using. 2. Call the library vendor and request a version for the compiler you're using.
Re: Using Turbo C with libraries compiled with Microsoft C
Author: david nugent
Date: Wed, 06 Jun 1990 05:11
Date: Wed, 06 Jun 1990 05:11
50 lines
2459 bytes
2459 bytes
In article <1990Jun4.205834.13661@cbnewsc.att.com>, tjr@cbnewsc.att.com (thomas.j.roberts) writes: > 1) TC returns 4-byte results in AX/DX; MC uses AX/BX (float/double > are returned in 8087 Top-Of-Stack register). This will make any > large-pointer function misbehave dangerously, and will give > erroneous results from any long function. This is not the case. Both compilers return long/large pointers in DX:AX > 2) TC and MC use different names for the various segments. > This will probably prevent it from linking properly (except for > huge model programs), and will cause subtle errors in a > huge-model program. Since TC 1.5, Borland have been using identical segment naming conventions to Microsoft. Besides, they can be changed in TC to suit. > 3) TC and MC package library routines differently, so you cannot > use both the MC and the TC run-time libraries. If the third-party > library depends upon the MC run-time library, this may cause > link and/or run-time problems. By and large, they are similar. The problem really arises in the "help functions" used by the compiler for, say long division, multiplication and shifting. They are named and called differently and each library compiled with it's own compiler will of course use only it's version. > 4) TC and MC have different requirements for subroutines to preserve > register contents. This will cause a serious disaster during > execution (write-protect those disks before executing!). Not at all true. Both compilers require preservation of _only_ DS, SI, DI and BP. > 5) The TC run-time library screws around with the console hardware > (even if you don't call any of its TEXT or GRAPHICS routines); > this can often be minimized by setting directvideo=0. Which has little to do with the compatibility between compilers... david -- Unique Computing Pty Ltd, Melbourne, Aust. david@csource.oz.au 3:632/348@fidonet 28:4100/1@signet
So then what's the difference between Turbo 2.0 and Quick C?
Author: David Albert
Date: Wed, 06 Jun 1990 16:37
Date: Wed, 06 Jun 1990 16:37
13 lines
1226 bytes
1226 bytes
>Both compilers return long/large pointers in DX:AX >Since TC 1.5, Borland have been using identical segment naming conventions >to Microsoft. Besides, they can be changed in TC to suit. etc... So: what are the advantages/disadvantages to Turbo C over Microsoft Quick C? Other than the price? ------------------------------------------------------------------------------ David Albert |Only hoping isn't/what gives us strength to cope. UUCP: ...!harvard!albert | Let us only hope,/but not *only* only hope. INTERNET: albert@harvard.edu | --Piet Hein
Re: Using Turbo C with libraries compiled with Microsoft C
Author: William C. Marsh
Date: Wed, 06 Jun 1990 19:08
Date: Wed, 06 Jun 1990 19:08
14 lines
1199 bytes
1199 bytes
In article <8@csource.OZ.AU> david@csource.OZ.AU (david nugent) writes:
>Since TC 1.5, Borland have been using identical segment naming conventions
>to Microsoft. Besides, they can be changed in TC to suit.
However, if you change the names, you then have problems linking in the
default library. Large model may get around this, but for smaller jobs
it would be a big problem...
Bill
--
Bill Marsh, Naval Ocean Systems Center, San Diego, CA
{arpa,mil}net: bmarsh@cod.nosc.mil
uucp: {ihnp4,akgua,decvax,dcdwest,ucbvax}!sdcsvax!nosc!bmarsh
"If everything seems to be coming your way, you're probably in the wrong lane."
Re: Using Turbo C with libraries compiled with Microsoft C
Author: Joe Huffman
Date: Thu, 07 Jun 1990 17:47
Date: Thu, 07 Jun 1990 17:47
59 lines
3514 bytes
3514 bytes
In article <2533@dataio.Data-IO.COM>, bright@Data-IO.COM (Walter Bright) writes: > In article <1990Jun5.134159.9577@ux1.cso.uiuc.edu> mcdonald@aries.scs.uiuc.edu (Doug McDonald) writes: > <In article <1990Jun4.205834.13661@cbnewsc.att.com> tjr@cbnewsc.att.com (thomas.j.roberts) writes: > <<There are several (many ?) differences between Turbo C and Microsoft C. . . . > In other words, the most practical courses of action are: > 1. Only buy libraries that come with source, and recompile it for the > compiler you're using. > 2. Call the library vendor and request a version for the compiler you're > using. One thing that I expected Walter to say but didn't, is that it is possible for library vendors to supply a single library that will work across MSC, TC, and Zortech C/C++. This is not possible in all cases, but in many it is. Walter had suggested I do this (and provided considerable help) with the graphics library that is shipped with Zortech C/C++ (we have since removed this feature, it now only works with Zortech). It is also possible to make this single library work with all memory models. The basics of the procedure for doing this is: 1) Use patchobj (from Zortech) on all .OBJ modules to remove references to the memory model the library was compiled under and default library searches. 2) Declare all functions and pointers as 'far'. Compile the library in "Large" memory model. 3) Provide all your own low level functions. Have NO unresolved externals from your library (use libunres supplied by Zortech to find them). This is a subtle problem, because the compiler generates function calls for things you didn't explicitly call, like long arithmetic. I achieved this by compiling my library with Zortech C and includeing the run time long arithemetic module (with the functions renamed) in my library. Use patchobj to rename all the long arithmetic functions to the new names. Hints, warnings, etc: In the FG graphics library I had to supply a few odds and ends functions like strcpy() and strcmp(), etc. These were either made static or given a new name (like fg_strcmp()). If I had needed file I/O I would have had to go directly to DOS and bypass the standard runtime library. The math library (sin(), pow(), etc) would be a major code size hit if it had been necessary to duplicate them. Fortunately my application didn't need this. Another major thing to watch out for is memory allocation. Do you need malloc() and siblings? Walter built in support for special versions in the runtime libraries for this, but it wouldn't be difficult for third party vendors to have their users supply the hooks for this. I explain this with the hope that more third party vendors to support more compilers (especially Zortech of course). It wasn't really that hard, and all the strange stuff (patchobj) is handled in the makefile once it is figured out. -- joe@proto.com uunet!proto!joe FAX: 208-263-8772
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