это именно то, что делает компоновщик, в чем проблема?
как
add r0,r0,r0
.data
aaa: .word 0xAAAAAAAA
bs
add r1,r1,r1
.data
bbbb: .word 0xBBBBBBBB
build:
arm-none-eabi-as a.s -o a.o
arm-none-eabi-as b.s -o b.o
arm-none-eabi-ld -Ttext=0x1000 -Tdata=0x2000 a.o b.o -o ab.elf
arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 0000000000001000
disassemble:
arm-none-eabi-objdump -D ab.elf
Disassembly of section .text:
00001000 <.text>:
1000: e0800000 add r0, r0, r0
1004: e0811001 add r1, r1, r1
Disassembly of section .data:
00002000 <__data_start>:
2000: aaaaaaaa bge feaacab0 <_stack+0xfea2cab0>
00002004 <bbbb>:
2004: bbbbbbbb bllt feef0ef8 <_stack+0xfee70ef8>
совершенно бесполезный код, но это так просто.Затем вы можете еще больше усложнить его, используя скрипт компоновщика и т. Д.
Естественно, в коде должно быть понятно, что он хочет ветвиться или вызывать функции локально или в других объектах с нормальным потоком.Но из этого примера легко увидеть, что компоновщик просто соединяет разделы .text и разделы .data.
Если сценарий компоновщика не диктует порядок, в котором они попадают в вывод, насколько я знаюувиденное определяется порядком, найденным в командной строке компоновщика.