Объединение двух файлов сборки вместе с разделом текста и данных - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть два файла сборки, as и bs. Я хочу объединить их оба и создать новый файл сборки cs. Файл cs должен иметь весь код в .text of as, а затем весь код в .text of bs Iхочу сделать то же самое с разделом .data

# File a.s
VSUB.F32 S4, S5, S6
.data
.word 0x10000000

# File b.s
VADD.F32 S4, S5, S6
.data
.word 0x20000000

# File c.s
.include "a.s"
.include "b.s"

Я хочу, чтобы мой вывод выглядел так:

.text
VSUB.F32 S4, S5, S6
VADD.F32 S4, S5, S6

.data
.word 0x10000000
.word 0x20000000

Однако это то, что я вижу после выгрузки объектного файла.

Disassembly of section .text:

00000000 <.text>:
0:  ee322ac3    vsub.f32    s4, s5, s6


00000000 <.data>:
0:  10000000    .word   0x10000000
4:  ee710a21    vadd.f32    s1, s2, s3
8:  20000000    .word   0x20000000

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Добавьте .text в начало каждого файла.

Ассемблер начинает с секции, установленной на .text.Однако, когда вы используете .include, это происходит в контексте включаемого файла ( cs в вашем случае), в котором для раздела установлено значение .data из предыдущего включения.

Теоретически, вам нужно всего лишь добавить .text в начало источника bs , но всегда полезно просто всегда использовать объявление .text в начале файла asembler.Вам могут понравиться .unified, .thumb и т. Д.

Это правда, что компоновщик решит эту проблему, но распространенным практическим примером является смешивание сгенерированного ассемблера с пользовательским кодом.Как правило, вам просто нужно driver.s , чтобы включить generate.s , и третий файл не нужен.Сгенерированный файл - это типичная таблица или структура данных из другого источника, например смещения структуры «C», константы преобразования и т. Д.

0 голосов
/ 08 февраля 2019

это именно то, что делает компоновщик, в чем проблема?

как

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.

Если сценарий компоновщика не диктует порядок, в котором они попадают в вывод, насколько я знаюувиденное определяется порядком, найденным в командной строке компоновщика.

...