

mkdir xatest
cd xatest
echo "jsr bla: loop: jmp loop" > 1.s
echo "bla: rts" > 2.s
xa -R -c -o 1.o65 1.s
xa -R -c -o 2.o65 2.s
ldo65 -o linked.o65 1.o65 2.o65
reloc65 -bt 32768 -xt -o t linked.o65
hexdump -C t

output:

00000000 20 06 80 4c 03 8c 60 | ..L..`|
00000007

The bytes 20 06 80 are correct, it's JSR $8006. But 4c 03 8c means JMP $8c03. What's wrong here?
Do I use it in a wrong way?

Following procedure leads to the expected code:
echo "jsr bla: loop: jmp loop: bla: rts" > 1.s
xa -R -c -o 1.o65 1.s
ldo65 -o linked.o65 1.o65
reloc65 -bt 32768 -xt -o t linked.o65
hexdump -C t

I use 2.3.0, it comes with Debian Testing.

==============================================================================
Analysis:

 cat 1.o65.hex
00000000  01 00 6f 36 35 00 00 10  00 10 06 00 00 04 00 00  |..o65...........|
00000010  00 40 00 00 04 00 00 00  00 00 00 20 00 00 4c 03  |.@......... ..L.|
00000020  10 01 00 62 6c 61 00 02  80 00 00 03 82 00 00 01  |...bla..........|
00000030  00 6c 6f 6f 70 00 02 03  10                       |.loop....|
00000039

file65 -V 1.o65
1.o65: o65 version 0 object file
 mode: 1000 =[object][16bit][byte relocation][CPU 6502][align 1]
 text segment @ $1000 - $1006 [$0006 bytes]
 data segment @ $0400 - $0400 [$0000 bytes]
 bss  segment @ $4000 - $4000 [$0000 bytes]
 zero segment @ $0004 - $0004 [$0000 bytes]
 stack size $0000 bytes (i.e. unknown)
Undefined Labels: 1
bla
Global Labels: 1
loop (segID=2 (text), offset=1003)


==> text segment start $1000, loop is at $1003 -> ok
    undef'd label bla stored as zero (00 00) in opcode -> ok
    relocation table entry: 	$1001, ADR, undef'd, label #0 -> ok
				$1004, ADR, text segment -> ok

---------------------------------------------------

cat 2.o65.hex
00000000  01 00 6f 36 35 00 00 10  00 10 01 00 00 04 00 00  |..o65...........|
00000010  00 40 00 00 04 00 00 00  00 00 00 60 00 00 00 00  |.@.........`....|
00000020  01 00 62 6c 61 00 02 00  10                       |..bla....|

file65 -V 2.o65
2.o65: o65 version 0 object file
 mode: 1000 =[object][16bit][byte relocation][CPU 6502][align 1]
 text segment @ $1000 - $1001 [$0001 bytes]
 data segment @ $0400 - $0400 [$0000 bytes]
 bss  segment @ $4000 - $4000 [$0000 bytes]
 zero segment @ $0004 - $0004 [$0000 bytes]
 stack size $0000 bytes (i.e. unknown)
Undefined Labels: 0
Global Labels: 1
bla (segID=2 (text), offset=1000)

=> text segment start 	$1000 -> ok
			no relocation table entries -> ok
			global label text segment, at $1000 -> ok

---------------------------------------------------

ldo65 -o linked.o65 1.o65 2.o65 

linked.o65.hex
00000000  01 00 6f 36 35 00 00 00  00 04 07 00 00 10 00 00  |..o65...........|
00000010  00 40 00 00 02 00 00 00  00 00 00 20 06 04 4c 03  |.@......... ..L.|
00000020  10 60 00 00 02 82 03 82  00 00 02 00 6c 6f 6f 70  |.`..........loop|
00000030  00 02 03 04 62 6c 61 00  02 06 04                 |....bla....|

ile65 -V linked.o65
linked.o65: o65 version 0 executable file
 mode: 0000 =[executable][16bit][byte relocation][CPU 6502][align 1]
 text segment @ $0400 - $0407 [$0007 bytes]
 data segment @ $1000 - $1000 [$0000 bytes]
 bss  segment @ $4000 - $4000 [$0000 bytes]
 zero segment @ $0002 - $0002 [$0000 bytes]
 stack size $0000 bytes (i.e. unknown)
Undefined Labels: 0
Global Labels: 2
loop (segID=2 (text), offset=0403)
bla (segID=2 (text), offset=0406)

=> text segment start $0400
	$0400 jsr $0406 -> RTS -> ok
	$0403 jmp $1003 >>>>>>>>>>>>>>>> wrong !!!
					should be $0403

