kernel.c:(.text+;0x2d):对`memset';
我正在编写一个自定义内核,但链接时出错。我已经把密码破解了,但还是没有运气。这是我的密码: kernel.c:kernel.c:(.text+;0x2d):对`memset';,c,kernel,ld,C,Kernel,Ld,我正在编写一个自定义内核,但链接时出错。我已经把密码破解了,但还是没有运气。这是我的密码: kernel.c: #include <string.h> // define our structure typedef struct __attribute__ ((packed)) { unsigned short di, si, bp, sp, bx, dx, cx, ax; unsigned short gs, fs, es, ds, eflags; } regs16
#include <string.h>
// define our structure
typedef struct __attribute__ ((packed)) {
unsigned short di, si, bp, sp, bx, dx, cx, ax;
unsigned short gs, fs, es, ds, eflags;
} regs16_t;
// tell compiler our int32 function is external
extern void int32(unsigned char intnum, regs16_t *regs);
// int32 test
void int32_test()
{
int y;
regs16_t regs;
// switch to 320x200x256 graphics mode
regs.ax = 0x0013;
int32(0x10, ®s);
// full screen with blue color (1)
memset((char *)0xA0000, 1, (320*200));
// draw horizontal line from 100,80 to 100,240 in multiple colors
for(y = 0; y < 200; y++)
memset((char *)0xA0000 + (y*320+80), y, 160);
// wait for key
regs.ax = 0x0000;
int32(0x16, ®s);
// switch to 80x25x16 text mode
regs.ax = 0x0003;
int32(0x10, ®s);
}
命令行和输出:
# gcc -fno-stack-protector -m32 -c kernel.c -o kc.o
# nasm -f elf32 kernel.asm -o kasm.o
# ld -m elf_i386 -T link.ld -o kernel kasm.o kc.o
kc.o: In function `int32_test':
kernel.c:(.text+0x2d): undefined reference to `memset'
kernel.c:(.text+0x5c): undefined reference to `memset'
一点背景:
我正在为一个我称之为AI眼镜的定制项目开发一个定制操作系统。我目前正在构建一个引导加载程序,它将显示一个徽标和一些加载指示器。我想我的指标会有点像Ubuntu。无论如何,我需要能够进入VGA模式并在屏幕上显示内容,而我(未来)的其他代码可以完全启动它
我的问题:
如何将memset的lib导入到代码中,以便ld可以完全链接我的代码。大多数库函数,包括
memset
,在内核模块中不可用
您需要创建自己的实现。它应该像单个
for
循环一样简单。由于您也在编写一些程序集,您可能希望尝试这样编写。大多数库函数,包括memset
,在内核模块中不可用
您需要创建自己的实现。它应该像单个
for
循环一样简单。由于您也在编写一些程序集,您可能希望尝试这样编写。这里的问题是链接器在您提供给ld的对象文件中找不到memset函数。kasm.o和kc.o似乎都没有这个功能。事实上,这是标准C库的一部分。所以,您需要链接标准C库libc.So或libc.a。如果您不想在内核中使用标准C库,则需要提供自己的memset实现。这里的问题是链接器在您提供给ld的对象文件中找不到memset函数。kasm.o和kc.o似乎都没有这个功能。事实上,这是标准C库的一部分。所以,您需要链接标准C库libc.So或libc.a。如果您不想在内核中使用标准C库,则需要提供自己的memset实现请详细说明我应该如何创建自己的实现。谢谢。@Aaronjam创建一个名为memset
的函数,并让它循环设置给定值的字节。@Aaronjam如果你不能编写一个简单的memcpy
函数,我不确定编写自定义内核是否适合你。请详细说明我应该如何创建自己的实现。谢谢。@Aaronjam创建一个名为memset
的函数,并让它循环设置给定值的字节。@Aaronjam如果您不能编写简单的memcpy
函数,我不确定编写自定义内核是否适合您。我如何链接标准C库?尝试将libc.a添加到ld call中libc.a位于最新Ubuntu上的哪个位置?应该在/usr/libI中提供/usr/lib中看不到libc.a。如何安装它?如何链接标准C库?尝试将libc.a添加到ld call中libc.a位于最新Ubuntu上的何处?应该在/usr/libI中提供,但在/usr/lib中看不到libc.a。如何安装它?
OUTPUT_FORMAT(elf32-i386)
ENTRY(start)
SECTIONS
{
. = 0x100000;
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
}
# gcc -fno-stack-protector -m32 -c kernel.c -o kc.o
# nasm -f elf32 kernel.asm -o kasm.o
# ld -m elf_i386 -T link.ld -o kernel kasm.o kc.o
kc.o: In function `int32_test':
kernel.c:(.text+0x2d): undefined reference to `memset'
kernel.c:(.text+0x5c): undefined reference to `memset'