Да, Linker объединяет все файлы .o (созданные из файлов .s) и создает один объектный файл. Таким образом, все ваши файлы c сначала станут файлами сборки.
Каждый файл сборки будет иметь список импорта и список экспорта. Список экспорта содержит все переменные, имеющие директиву .global
или .globl
. Список импорта содержит все переменные, начинающиеся с extern в файле c. (Однако GAS, в отличие от NASM, не требует объявления импорта. Все символы, которые не определены в файле, считаются внешними. быть определено где-то еще.)
Итак, если ваш файл сборки содержит это:
.globl _num # _num is a global symbol, when it is defined
.data # switch to read-write data section
.align 4
_num: # declare the label
.long 33 # 4 bytes of initialized storage after the label
Все, что вам нужно сделать, чтобы использовать num, это создать переменную extern, подобную этой
extern int num; // declare the num variable as extern in your C code
и тогда вы сможете прочитать его или изменить.
Многие платформы (Windows, OS X) добавляют начальное подчеркивание к именам символов, поэтому переменная C num
имеет ассемблерное имя _num
. Linux/ELF этого не делает, поэтому имя asm тоже будет num
.
person
theRealWorld
schedule
11.03.2012