Như chúng ta đã biết, các tệp lắp ráp (.S) sẽ nhận tiền xử lý trước khi lắp ráp, nhưng tôi thấy rằng sau khi tiền xử lý có thể có cấu trúc nguyên mẫu/chức năng trong tập tin kết quả, Gnu sẽ xử lý các nguyên mẫu này như thế nào? Chỉ cần bỏ qua nó?GNU có thể là cấu trúc quy trình và các nguyên mẫu chức năng trong tệp lắp ráp (.s) không?
Ví dụ, lệnh sau:
gcc -E -o tmp.result arch/x86/boot/copy.S -Iinclude/ -Iarch/x86/include/
và kết quả lắp ráp tập tin (tmp.result) là:
# 1 "arch/x86/boot/copy.S"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "arch/x86/boot/copy.S"
# 11 "arch/x86/boot/copy.S"
# 1 "include/linux/linkage.h" 1
# 1 "include/linux/compiler.h" 1
# 5 "include/linux/linkage.h" 2
# 1 "include/linux/stringify.h" 1
# 6 "include/linux/linkage.h" 2
# 1 "include/linux/export.h" 1
# 26 "include/linux/export.h"
struct kernel_symbol
{
unsigned long value;
const char *name;
};
# 7 "include/linux/linkage.h" 2
# 1 "arch/x86/include/asm/linkage.h" 1
# 8 "include/linux/linkage.h" 2
# 12 "arch/x86/boot/copy.S" 2
.code16
.text
GLOBAL(memcpy)
pushw %si
pushw %di
movw %ax, %di
movw %dx, %si
pushw %cx
shrw $2, %cx
rep; movsl
popw %cx
andw $3, %cx
rep; movsb
popw %di
popw %si
retl
ENDPROC(memcpy)
nhưng khi cố gắng để lắp ráp tập tin này:
as -o tmp.o tmp.result
sản xuất lỗi sau:
include/linux/export.h: Assembler messages:
include/linux/export.h:26: Error: no such instruction: `struct kernel_symbol'
include/linux/export.h:27: Error: junk at end of line, first unrecognized character is `{'
include/linux/export.h:28: Error: no such instruction: `unsigned long value'
include/linux/export.h:29: Error: no such instruction: `const char *name'
include/linux/export.h:30: Error: junk at end of line, first unrecognized character is `}'
arch/x86/boot/copy.S:20: Error: invalid character '(' in mnemonic
arch/x86/boot/copy.S:34: Error: invalid character '(' in mnemonic
arch/x86/boot/copy.S:36: Error: invalid character '(' in mnemonic
arch/x86/boot/copy.S:49: Error: invalid character '(' in mnemonic
arch/x86/boot/copy.S:51: Error: invalid character '(' in mnemonic
arch/x86/boot/copy.S:58: Error: invalid character '(' in mnemonic
arch/x86/boot/copy.S:60: Error: invalid character '(' in mnemonic
arch/x86/boot/copy.S:67: Error: invalid character '(' in mnemonic
Có vẻ như trình biên dịch không thể xử lý cấu trúc trong tmp.result. Làm thế nào mã nguồn Linux (.S) có thể thông qua việc lắp ráp?
Điều gì xảy ra với tệp 'tmp.result'? Lệnh tiếp theo làm việc với 'tmp.result' là gì? – Downvoter
@Downvoter lệnh tiếp theo làm việc trên tmp.result là: 'as -o tmp.o tmp.result', nhưng nó tạo ra lỗi, cho biết nó không nhận ra cấu trúc trong tmp.result, vì vậy tôi đi lang thang cách mã nguồn Linux có thể có được thông qua lắp ráp. – Kingwah
Bạn có thể sử dụng 'gcc -save-temps' để lưu tệp được xử lý trước thực tế mà nó cung cấp cho trình biên dịch. Như câu trả lời của Matteo chỉ ra, nó sẽ khác với những gì bạn nhận được với 'gcc -E'. Bạn cũng có thể sử dụng 'gcc -v' để xem chính xác cách nó gọi CPP. –