Да, компоновщик объединяет все файлы .o (созданные из файлов .s) и создает один объектный файл.Таким образом, все ваши файлы c сначала станут файлами сборки.
Каждый файл сборки будет иметь список импорта и список экспорта.Список экспорта содержит все переменные, которые имеют директиву .global
или .globl
.Список импорта содержит все переменные, начинающиеся с extern в файле c.(Однако, в отличие от NASM, GAS не требует объявления импорта. Все символы, которые не определены в файле, считаются внешними. Но получающиеся в результате объектные файлы .o
или .obj
будут иметь импортированные списки символов, которые онииспользовать и требовать определения где-то еще.)
Итак, если ваш файл сборки содержит это:
.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
имеет имя asm _num
.Linux / ELF этого не делает, поэтому имя asm также будет num
.