Compile and Link to .com file with Turbo C
Asked Answered
S

3

5

I'm trying to compile and link a simple program to a DOS .com file using Turbo C compiler and linker. By that I try the simplest C-program I can think of.

void main()
{}

Are there command line arguments to link to com files in the Turbo C Linker?

The Error Message I get from the Linker is the following:

"Fatal: Cannot generate COM file: invalid entry point address"

I know that com files need entry point to be at 100h. Does Turbo C have an option to set this address?

Sour answered 1/5, 2019 at 14:50 Comment(3)
Did you ever have any luck solving your problem?Tussle
Yes I did have some luck. used a c0t.asm file as entrypoint and upgraded to some later version of Turbo C or C++.Sour
So I guess some part of my answer may have applied to your situation?Tussle
T
5

It has been a long time since I have genuinely tried to use Turbo-C for this kind of thing. If you are compiling and linking on the command line separately with TCC.EXE and TLINK.EXE then this may work for you.

To compile and link to a COM file you can do this for each one of your C source files creating an OBJ file for each:

tcc -IF:\TURBOC3\INCLUDE -c -mt file1.c
tcc -IF:\TURBOC3\INCLUDE -c -mt file2.c
tcc -IF:\TURBOC3\INCLUDE -c -mt file3.c

tlink -t -LF:\TURBOC3\LIB c0t.obj file1.obj file2.obj file3.obj,myprog.com,myprog.map,cs.lib

Each C file is compiled individually using -mt (tiny memory model) to a corresponding OBJ file. The -I option specifies the path of the INCLUDE directory in your environment (change accordingly). The -c option tell TCC to compile to a OBJ file only.

When linking -t tells the linker to generate a COM program (and not an EXE), -LF:\TURBOC3\LIB is the path to the library directory in your environment (change accordingly). C0T.OBJ is the C runtime file for the tiny memory model. This includes the main entry point that you are missing. You then list all the other OBJ files separated by a space. After the first comma is the output file name. If using -t option name the program with a COM extension. After the second comma is the MAP file name (you can leave the file name blank if you don't want a MAP file). After the third comma is the list of libraries separated by spaces. With the tiny model you want to use the small model libraries. The C library for the small memory model is called CS.LIB .

As an example if we have a single source file called TEST.C that looks like:

#include<stdio.h>

int main()
{
    printf("Hello, world!\n");
    return 0;
}

If we want to compile and link this the commands would be:

tcc -IF:\TURBOC3\INCLUDE -c -mt test.c
tlink -t -LF:\TURBOC3\LIB c0t.obj test.obj,test.com,test.map,cs.lib

You will have to use the paths for your own environment. These commands should produce a program called TEST.COM. When run it should print:

Hello, world!

Tussle answered 1/5, 2019 at 22:7 Comment(0)
M
1

You can generate COM file while still using IDE to generate EXE. Following worked on TC 2.01. Change memory model to Tiny in the options, then compile the program and generate EXE file, then go to command prompt, and run EXE2BIN PROG.EXE PROG.COM. Replace PROG with your program name.

Monasticism answered 9/6, 2021 at 20:49 Comment(0)
C
-3

Your problem is about "entry point"

some compiler or linker can recognize void main() like entry point omiting a return value but no all of them.

You shoud use int main() entry point instead for better control of app and compiler can recognize main function as entry point

example:

int main() {
/* some compiler return 0 when you don't for main,
 they can ask for return value */
}

from geekforgeeks:

A conforming implementation may provide more versions of main(), but they must all have return type int. The int returned by main() is a way for a program to return a value to “the system” that invokes it. On systems that doesn’t provide such a facility the return value is ignored, but that doesn’t make “void main()” legal C++ or legal C. Even if your compiler accepts “void main()” avoid it, or risk being considered ignorant by C and C++ programmers. In C++, main() need not contain an explicit return statement. In that case, the value returned is 0, meaning successful execution.

source: https://www.geeksforgeeks.org/fine-write-void-main-cc/

Ceremonious answered 1/5, 2019 at 17:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.