У меня есть набор функций сборки, которые я хочу использовать в программах на Си, создав файл заголовка. Например, если у меня есть asm_functions.s, который определяет фактические процедуры сборки, и asm_functions.h, в котором есть прототипы для функций, а также некоторые стандартные # define, которые мне нужны Моя цель - использовать программу на C, скажем test_asm.c, для вызова функций сборки.
asm__functions.h:
<code>
#define ASM_CONST_1 0x80
#define ASM_CONST_2 0xaf</p>
<p>uint8_t asm_foo( int, int, int );
asm__functions.s:
<code>
/* dont need this: #include "asm_functions.h" */</p>
<p>.section .text
.type asm_foo, @function
asm__foo:
/* asm code with proper stack manipulation for C calling conventions */
ret
test__asm.c:
<code>
#include "asm_foo.h"</p>
<p>int main() {
uint8_t res = asm_foo( 1, 2, 3);
return 0;
}
В такой ситуации, каков будет правильный способ составить ссылку на программу? Я пытался что-то вроде этого:
<code>
gas -o asm_foo.o asm_foo.s
gcc -o test_asm test_asm.c
Но я все еще получаю ошибку компоновщика от GCC, говорящую, что моя процедура сборки не определена. Я надеюсь, что этот надуманный пример достаточно хорош, чтобы объяснить ситуацию.
Спасибо!
EDIT:
Вот фрагмент вывода при компиляции с помощью одной команды:
<code>
tja@tja-desktop:~/RIT/SP2/latest$ gcc -o test_pci pci_config.s test_pci.c
/tmp/ccY0SmMN.o: In function <code>_pci_bios_read_byte':
(.text+0x8): undefined reference to</code>PCI_FUNCTION_ID'
/tmp/ccY0SmMN.o: In function <code>_pci_bios_read_byte':
(.text+0xa): undefined reference to</code>READ_CONFIG_BYTE'
/tmp/ccY0SmMN.o: In function <code>_pci_bios_read_byte':
(.text+0x18): undefined reference to</code>PCI_BIOS_FUNCTION_INT'
/tmp/ccY0SmMN.o: In function <code>_pci_bios_read_byte':
(.text+0x1b): undefined reference to</code>BAD_REGISTER_NUMBER'
/tmp/ccY0SmMN.o: In function <code>_pci_bios_read_word':
(.text+0x30): undefined reference to</code>PCI_FUNCTION_ID'
...
Все они, такие как PCI_FUNCTION_ID, определены в моем заголовочном файле, который включен в C-программу. Когда я сам компилирую ассемблерный код, ошибок нет.