gnu ld 将程序集输出视为链接描述文件,如何修复?或者我在编译时做错了什么?
gnu ld treating assembly output as linker script, how to fix? or am i doing something wrong in my compiling?
我一直在研究我的内核项目并模拟它(即在 QEMU 上 运行 它),我需要它作为 .iso 文件。
我有一个程序集文件 assemble 它 - as --32 boot.s -o boot.o
对于主要代码(在 c++ 中),编译它 - gcc -S kernel.cpp -lstdc++ -o kernel.o
没有报错。但是,
将其与此链接器脚本链接时:-
ENTRY(_start)
SECTIONS
{
/* we need 1MB of space atleast */
. = 1M;
/* text section */
.text BLOCK(4K) : ALIGN(4K)
{
*(.multiboot)
*(.text)
}
/* read only data section */
.rodata BLOCK(4K) : ALIGN(4K)
{
*(.rodata)
}
/* data section */
.data BLOCK(4K) : ALIGN(4K)
{
*(.data)
}
/* bss section */
.bss BLOCK(4K) : ALIGN(4K)
{
*(COMMON)
*(.bss)
}
}
(我使用的链接命令是ld -T linker.ld kernel.o boot.o -o OS.bin
)
它说:-
ld:kernel.o: file format not recognized; treating as linker script
ld:kernel.o:1: syntax error
我在链接或汇编 boot.s 或编译 kernel.cpp 时做错了什么吗?
gcc -S
生成汇编语言,但 ld
需要目标文件。介于两者之间,您必须 运行 汇编程序。
没有特别需要使用汇编器输出,因此您很可能想使用 -c
,它先进行编译然后汇编以生成目标文件,而不是 -S
:
gcc -c kernel.cpp -o kernel.o
-lstdc++
没用,因为它仅在链接时适用,无论如何,您似乎不太可能在内核中成功使用标准 C++ 库。
我一直在研究我的内核项目并模拟它(即在 QEMU 上 运行 它),我需要它作为 .iso 文件。
我有一个程序集文件 assemble 它 - as --32 boot.s -o boot.o
对于主要代码(在 c++ 中),编译它 - gcc -S kernel.cpp -lstdc++ -o kernel.o
没有报错。但是,
将其与此链接器脚本链接时:-
ENTRY(_start)
SECTIONS
{
/* we need 1MB of space atleast */
. = 1M;
/* text section */
.text BLOCK(4K) : ALIGN(4K)
{
*(.multiboot)
*(.text)
}
/* read only data section */
.rodata BLOCK(4K) : ALIGN(4K)
{
*(.rodata)
}
/* data section */
.data BLOCK(4K) : ALIGN(4K)
{
*(.data)
}
/* bss section */
.bss BLOCK(4K) : ALIGN(4K)
{
*(COMMON)
*(.bss)
}
}
(我使用的链接命令是ld -T linker.ld kernel.o boot.o -o OS.bin
)
它说:-
ld:kernel.o: file format not recognized; treating as linker script
ld:kernel.o:1: syntax error
我在链接或汇编 boot.s 或编译 kernel.cpp 时做错了什么吗?
gcc -S
生成汇编语言,但 ld
需要目标文件。介于两者之间,您必须 运行 汇编程序。
没有特别需要使用汇编器输出,因此您很可能想使用 -c
,它先进行编译然后汇编以生成目标文件,而不是 -S
:
gcc -c kernel.cpp -o kernel.o
-lstdc++
没用,因为它仅在链接时适用,无论如何,您似乎不太可能在内核中成功使用标准 C++ 库。