gpt4 book ai didi

c - 使用 FASM 将汇编生成的代码嵌入到 C 程序中

转载 作者:行者123 更新时间:2023-11-30 17:05:44 35 4
gpt4 key购买 nike

我正在尝试将汇编编译的代码与 C 编译的代码链接起来,并且在链接阶段出现 undefined reference 错误。我就是这样做的:

[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

关于c - 使用 FASM 将汇编生成的代码嵌入到 C 程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35119456/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com