| YaK:: CMOC 0.1.78 bug report : lib/float-ctor.native_o for OS9 | [Changes] [Calendar] [Search] [Index] [PhotoTags] |
dcf6:39 {rts } a=df b=a1 x=dfa1:3031 y=0000:00ff u=0024:0000 s=1ef9:a015,0001 cc=EfhiNzvc dp=00 #2586085 {{x.x.s:00353 | bss_end RTS end of global variable initialization}}
a038:163c99 {lbra $dcd4 } a=df b=a1 x=dfa1:3031 y=0000:00ff u=0024:0000 s=1ef9:a015,0001 cc=EfhiNzvc dp=00 #2586086 {{crt.asm.os9asm:00096 | LBRA constructors}}
dcd4:308dcbff {leax $a8d7,pcr } a=df b=a1 x=a8d7:c621 y=0000:00ff u=0024:0000 s=1ef9:a015,0001 cc=EfhiNzvc dp=00 #2586087 {{}}
dcd8:af8dc338 {stx $a014,pcr } a=df b=a1 x=a8d7:c621 y=0000:00ff u=0024:0000 s=1ef9:a015,0001 cc=EfhiNzvc dp=00 #2586088 {{}}
dcdc:39 {rts } a=df b=a1 x=a8d7:c621 y=0000:00ff u=0024:0000 s=1efb:0001,0020 cc=EfhiNzvc dp=00 #2586089 {{crt.asm.os9asm:00579 | RTS}}
a015:d709 {stb $09 } a=df b=a1 x=a8d7:c621 y=0000:00ff u=0024:0000 s=1efb:0001,0020 cc=EfhiNzvc dp=00 #2586090 {{x.x.s:00016 | LBSR _main call main()}}
That's at the end of the global variable initialization, and it calls constructors. There's only one constructor SECTION, length 8, from cmoc/lib/float-ctor.native_o
The source of that constructor seems to be in enableCMOCFloatSupport.asm:
_enableCMOCFloatSupport
leax unpackSingleAndConvertToASCII,PCR ; PCR in caps b/c ref to code
stx unpackSingleAndConvertToASCII_hook,pcr
I've forgotten what the ",PCR" vs ",pcr" rule is, but I think the "stx" should not be Program Counter Relative on OS9.
Notice that the "stx $a014,pcr" is overwriting the first byte of the instruction that is executed after the "rts", at $a015 -- it should be a LBSR _main (as it is in the source at the right) but it has become a "stb $09" instruction (as the emulator decoded it at the left).
I also don't know how CMOC Float Support got enabled in my binary. I don't think it should be.
I'm pretty sure that my cmoc linkage hacks do not create this bug.
Also it doesn't look like any changes from 0.1.78 to 0.1.79 would fix it.
Here's Hello World, and it causes the float support constructor:
$
$ which cmoc
/opt/yak/cmoc/bin/cmoc
$ cmoc -v
cmoc (cmoc 0.1.78)
$ cat -n hello.c
1 #include <cmoc.h>
2
3 int main() {
4 printf("hello world\n");
5 return 0;
6 }
$ cmoc --os9 -i hello.c
$ grep constructor hello.map
Section: constructors_start (crt.os9_o) load at 0660, length 0000
Section: constructors (/opt/cmoc-0.1.78/share/cmoc/lib/float-ctor.native_o) load at 0660, length 0008
Section: constructors_end (crt.os9_o) load at 0668, length 0001
Symbol: \02constructors (/opt/cmoc-0.1.78/share/cmoc/lib/float-ctor.native_o) = 0660
Symbol: \02constructors_end (crt.os9_o) = 0668
Symbol: \02constructors_start (crt.os9_o) = 0660
Symbol: constructors (crt.os9_o) = 0660
Symbol: l_constructors (<synthetic>) = 0008
Symbol: l_constructors_end (<synthetic>) = 0001
Symbol: l_constructors_start (<synthetic>) = 0000
Symbol: s_constructors (<synthetic>) = 0660
Symbol: s_constructors_end (<synthetic>) = 0668
Symbol: s_constructors_start (<synthetic>) = 0660
$
$ lwasm --version
lwasm from lwtools 4.19
$ lwlink --version
lwlink from lwtools 4.19
$
A log of its execution shows the bug at the third-to-the-last instruction in this log file:
| (last modified 2022-09-13) [Login] |