Discussion:
link order
(too old to reply)
muta...@gmail.com
2023-06-23 07:59:52 UTC
Permalink
I am using Visual C++ 1.52 to create a 16-bit DOS executable
and my link command starts:

link /cp:1 /noi /nod /map /nologo /dosseg ploadst.obj+pload.obj+int13x.obj+

The map shows:

Start Stop Length Name Class
00000H 00788H 00789H PLOADST_TEXT CODE
0078AH 0078AH 00000H PLOAD_TEXT CODE
0078AH 007F9H 00070H INT13X_TEXT CODE
007FAH 00C64H 0046BH DOSSUPA_TEXT CODE
00C66H 00C66H 00000H DOSSUPC_TEXT CODE
00C66H 00C66H 00000H BOS_TEXT CODE
00C66H 00F45H 002E0H SUPPORT_TEXT CODE
00F46H 00F46H 00000H MINIFAT_TEXT CODE
00F46H 00F46H 00000H STRING_TEXT CODE
00F46H 00F46H 00000H PDOSLOAD_TEXT CODE
00F46H 01091H 0014CH LLDOS_TEXT CODE
01092H 01214H 00183H PROTINTA_TEXT CODE
01218H 012BDH 000A6H _TEXT32 CODE
012BEH 012BEH 00000H FILE_TEXT CODE
012BEH 012BEH 00000H PROTINT_TEXT CODE
012BEH 012BEH 00000H CTYPE_TEXT CODE
012C0H 09455H 08196H COMDAT_SEG1 CODE
09456H 09B1FH 006CAH _DATA DATA
09B20H 09B20H 00000H CONST CONST
09B20H 0A39BH 0087CH _BSS BSS
0A3A0H 0A94BH 005ACH c_common BSS
0A950H 0B94FH 01000H STACK STACK

which is the correct order, with pload coming second.

But this:

Address Publics by Value

0000:0700 __startup
0000:0758 _clrbss
0000:0775 _displayc
0000:0784 __exita
0078:000A _int13x
007F:000A ___open
007F:0031 ___creat
007F:0058 ___read
007F:0084 ___write
007F:00B0 ___seek
...
0121:0008 _rtop_stage2
0121:008A _runreal
012C:0000 _main
012C:0546 _dstart
012C:0BD4 _readAbs
012C:0DDA _dumpbuf
012C:0E20 _dumplong
012C:0EC8 ___divide
012C:0FBE ___modulo
012C:10BE ___subhphp
012C:1128 _BosSetCursorPosition
012C:1156 _BosScrollWindowUp
012C:1198 _BosWriteText


shows that other things ended up being earlier than
the stuff in pload:

C:\devel\pdos\src>grep main pload.c
pload.c: /* Released to the Public Domain */
pload.c: int main(void)
pload.c: /* we need to enter here to avoid Watcom name mangling of main() */
pload.c: main();

C:\devel\pdos\src>grep dstart pload.c
pload.c: void dstart(int drive, char *edata)

C:\devel\pdos\src>grep dumplong pload.c
pload.c: void dumplong(unsigned long x);
pload.c: /* now you can do debugging with dumplong/dumpbuf, without
pload.c: void dumplong(unsigned long x)

C:\devel\pdos\src>


Almost everything appears to have been moved to here:

012C0H 09455H 08196H COMDAT_SEG1 CODE

and then rearranged in an order that I don't actually want.

Any idea what is happening?

I have no idea what "COMDAT_SEG1" means.

I looked at all the link options and didn't see anything
that might keep things in the right order.

Thanks. Paul.
muta...@gmail.com
2023-06-23 09:59:37 UTC
Permalink
Switching from -O2 to -Ox solved the problem.

I think because -O2 must have -Gy which separates
functions into separate segments (or something like
that) so that the linker can eliminate dead code.

So now I have a bigger executable, but at least it is
in the right order so that I can minimize the number
of sectors that the boot sector needs to load.

BFN. Paul.

Loading...