簡體   English   中英

使用FASM將匯編生成的代碼嵌入C程序

[英]embed assembly produced code into C program using FASM

我試圖用C編譯的代碼鏈接匯編編譯的代碼,並且在鏈接階段出現未定義的引用錯誤。 這是我的方法:

[niko@dev1 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
[niko@dev1 test]$ fasm ssefuncs.asm ssefuncs.o
flat assembler  version 1.71.50  (16384 kilobytes memory)
1 passes, 405 bytes.
[niko@dev1 test]$ ls -l ssefuncs.o
-rw-r--r-- 1 niko niko 405 Jan 31 14:52 ssefuncs.o
[niko@dev1 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    
[niko@dev1 test]$ cat stest.c 
void asm_sse();

int main() {

    asm_sse();
}
[niko@dev1 test]$ gcc -c stest.c 
[niko@dev1 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
[niko@dev1 test]$ 

看一下ELF文件,它很薄,我看不到任何符號。

[niko@dev1 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.
[niko@dev1 test]$ 

將FASM產生的匯編代碼嵌入C程序的正確方法是什么?

匯編代碼中的子例程名稱通常只是指令流中某些位置的標簽。 對於與外部目標代碼的鏈接,不會自動使它們可見。 為了使之成為可能,應將符號聲明為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

這很大程度上取決於所使用的編譯器。 例如,GCC(通過克隆,clang)具有非常廣泛的功能,可以在線編寫匯編語言片段,處理與周圍代碼交互的例行細節(按需保存損壞的寄存器,將輸入放置在可以使用的位置並進行提取)結果,並將輸入/輸出與給定的值進行匹配)。 這通常是最簡單的方法。

如果沒有上述選擇,則應從編寫簡短的C程序開始,然后將其編譯為匯編程序。 諸如cc -g -S somefile.c類的東西應該為您提供帶有匯編語言的somefile.s -g (或其他調試啟用)應在代碼中包含注釋,以便更輕松地向C進行反向引用。這將允許您對工程結果進行反向工程,並通過弄亂了inard的內容作為獨立程序集文件的起點。編譯的函數。

就像@LaurentH的評論所說,編譯器經常以生成的匯編語言來修飾源符號的名稱,以防止與外部符號沖突,例如,在特定的匯編中添加_甚至某些合法的字符,例如在C中則不允許. $

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM