2016-01-31 4 views
0

Я пытаюсь связать сборку с помощью скомпилированного кода, и я получаю неопределенную ошибку ссылки во время фазы связывания. Вот так я это делаю:встраивать сборку кода в программу на C с помощью FASM

[[email protected] test]$ cat ssefuncs.asm 
format ELF64 
EQUAL_ANY  = 0000b 
RANGES   = 0100b 
EQUAL_EACH  = 1000b 
EQUAL_ORDERED  = 1100b 
NEGATIVE_POLARITY = 010000b 
BYTE_MASK = 1000000b 


asm_sse: 
    movntdqa xmm0,[eax] 
    pcmpestri xmm0,[ecx],0x0 

    ret 
[[email protected] test]$ fasm ssefuncs.asm ssefuncs.o 
flat assembler version 1.71.50 (16384 kilobytes memory) 
1 passes, 405 bytes. 
[[email protected] test]$ ls -l ssefuncs.o 
-rw-r--r-- 1 niko niko 405 Jan 31 14:52 ssefuncs.o 
[[email protected] test]$ objdump -M intel -d ssefuncs.o 

ssefuncs.o:  file format elf64-x86-64 


Disassembly of section .flat: 

0000000000000000 <.flat>: 
    0: 67 66 0f 38 2a 00  movntdqa xmm0,XMMWORD PTR [eax] 
    6: 67 66 0f 3a 61 01 00 pcmpestri xmm0,XMMWORD PTR [ecx],0x0 
    d: c3      ret  
[[email protected] test]$ cat stest.c 
void asm_sse(); 

int main() { 

    asm_sse(); 
} 
[[email protected] test]$ gcc -c stest.c 
[[email protected] test]$ gcc -o stest ssefuncs.o stest.o 
stest.o: In function `main': 
stest.c:(.text+0xa): undefined reference to `asm_sse' 
collect2: error: ld returned 1 exit status 
[[email protected] test]$ 

Глядя на файл ELF, он очень тонкий, и я не вижу никаких символов. :

[[email protected] test]$ readelf -a ssefuncs.o 
ELF Header: 
    Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF64 
    Data:        2's complement, little endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        REL (Relocatable file) 
    Machine:       Advanced Micro Devices X86-64 
    Version:       0x1 
    Entry point address:    0x0 
    Start of program headers:   0 (bytes into file) 
    Start of section headers:   149 (bytes into file) 
    Flags:        0x0 
    Size of this header:    64 (bytes) 
    Size of program headers:   0 (bytes) 
    Number of program headers:   0 
    Size of section headers:   64 (bytes) 
    Number of section headers:   4 
    Section header string table index: 3 

Section Headers: 
    [Nr] Name    Type    Address   Offset 
     Size    EntSize   Flags Link Info Align 
    [ 0]     NULL    0000000000000000 00000000 
     0000000000000000 0000000000000000   0  0  0 
    [ 1] .flat    PROGBITS   0000000000000000 00000040 
     000000000000000e 0000000000000000 WAX  0  0  8 
    [ 2] .symtab   SYMTAB   0000000000000000 0000004e 
     0000000000000030 0000000000000018   3  2  8 
    [ 3] .strtab   STRTAB   0000000000000000 0000007e 
     0000000000000017 0000000000000000   0  0  1 
Key to Flags: 
    W (write), A (alloc), X (execute), M (merge), S (strings), l (large) 
    I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) 
    O (extra OS processing required) o (OS specific), p (processor specific) 

There are no section groups in this file. 

There are no program headers in this file. 

There are no relocations in this file. 

The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported. 

Symbol table '.symtab' contains 2 entries: 
    Num: Value   Size Type Bind Vis  Ndx Name 
    0: 0000000000000000  0 NOTYPE LOCAL DEFAULT UND 
    1: 0000000000000000  0 SECTION LOCAL DEFAULT 1 .flat 

No version information found in this file. 
[[email protected] test]$ 

Каков правильный способ встраивания кода сборки FASM в программу C?

+0

Часто компилятор создает символы, добавляя одно или два символа подчеркивания к идентификаторам, используемым в коде C. Вы пытались использовать _asm_sse (с подчеркиванием как префикс) вместо asm_sse в своем ассемблере? –

+0

нет, я этого не сделал, потому что мой файл .o полностью пуст! если там будет символ _asm_sse, я бы увидел его с objdump – Nulik

+0

Вы должны сделать 'asm_sse' видимым для объектного кода из других файлов директивой, такой как' public asm_sse'. Кроме того, поместите код в раздел '.text', предваряя его чем-то вроде' section '.text' code readable executable'. –

ответ

1

Имена подпрограмм в коде сборки обычно являются просто метками для определенных позиций в потоке команд. Они не становятся автоматически видимыми для связи с внешним объектным кодом. Чтобы сделать возможным, символ должен быть объявлен public. Кроме того, по соглашению, код в файлах ELF находится в разделе .text. Файл сборки должен выглядеть так:

format ELF64 
EQUAL_ANY  = 0000b 
RANGES   = 0100b 
EQUAL_EACH  = 1000b 
EQUAL_ORDERED  = 1100b 
NEGATIVE_POLARITY = 010000b 
BYTE_MASK = 1000000b 

section '.text' code readable executable 

asm_sse: 
    movntdqa xmm0,[eax] 
    pcmpestri xmm0,[ecx],0x0 

    ret 

public asm_sse 
-1

Это зависит от используемого компилятора. Например. GCC (и клонированием, clang) имеет очень экстренное средство для написания фрагментов ассемблера в режиме онлайн, обработки рутинных деталей взаимодействия с окружающим кодом (при сохранении скребковых регистров по мере необходимости, размещении входов там, где их можно использовать и собирать результаты и соответствующие входы/выходы с тем, что дано). Обычно это самый простой способ.

Если вышеуказанное не является вариантом, вы должны начать с написания короткой программы на С и скомпилировать ее для сборки. Что-то вроде cc -g -S somefile.c должно дать вам somefile.s с ассемблером. -g (или другое средство отладки) должен содержать комментарии в коде, что позволяет упростить обратную ссылку на C. Это позволит вам перепроектировать результат компилятора и послужить отправной точкой для автономного файла сборки, вступая в скомпилированные функции.

Как комментирует @LaurentH, часто компиляторы манипулируют именами исходных символов в сгенерированном языке ассемблера, чтобы предотвратить столкновение с внешними символами, например. добавление _ или даже некоторые символы, законные в конкретной сборке, но не в C, например . или $.

+0

Мне нужна сборка, я пишу ядро ​​для новой облегченной ОС с массовыми параллельными вычислениями – Nulik

Смежные вопросы