kernel.c:(.text+;0x2d):对`memset';

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

我正在编写一个自定义内核,但链接时出错。我已经把密码破解了,但还是没有运气。这是我的密码:

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_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, &regs);

    // 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, &regs);

    // switch to 80x25x16 text mode
    regs.ax = 0x0003;
    int32(0x10, &regs);
}
命令行和输出:

# 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'