我正在编码一个32/64位内核。我遇到一个奇怪的问题,当我尝试将const char*char *char []传递给函数时,数组始终为空。

例如,

我有一个kmain执行gdt,idt,isrs,irq,视频和计时器初始化,然后在我写时:

 test_func("test");


test_func(char * string)调试代码:

void test_func(char * string)
{
    if(string[0] == '\0'){
        putch('n');
    }else{
        putch('o');
    }
}


我一直在屏幕上显示“ n”。

如果我测试:

 if (string == NULL){
       putch('n');
 }else{
       putch('o');
       putch(string[0]);
 }


我在没有字符串的第一个字符的情况下得到o

用于链接和编译,我正在使用

ld -m i386linux -T linker/link.ld  -nostdlib  -o kern.my ../obj/start.o \
                      ../obj/main.o \
                      ../obj/scrn.o \
                       ../obj/gdt.o \
                       ../obj/idt.o \
                      ../obj/isrs.o \
                       ../obj/irq.o \
                     ../obj/timer.o \
                        ../obj/io.o \
                     ../obj/yshell.o \
                        ../obj/kb.o


我正在使用Qemu i386测试kern.my

[链接描述文件]

OUTPUT_FORMAT("binary")
ENTRY(start)
phys = 0x100000;
SECTIONS
{
  .text phys : AT(phys) {
    code = .;
    *(.text)
    *(.rodata)
    . = ALIGN(4096);
  }
  .data : AT(phys + (data - code))
  {
    data = .;
    *(.data)
    . = ALIGN(4096);
  }
  .bss : AT(phys + (bss - code))
  {
    bss = .;
    *(.bss)
    . = ALIGN(4096);
  }
  end = .;
}


我将Qemu和GDB一起使用,我的信息寄存器:

eax            0x1  1
ecx            0x0  0
edx            0x3d5    981
ebx            0x9500   38144
esp            0x104fe0 0x104fe0
ebp            0x0  0x0
esi            0x0  0
edi            0x108000 1081344
eip            0x100356 0x100356
eflags         0x6  [ PF ]
cs             0x8  8
ss             0x10 16
ds             0x10 16
es             0x10 16
fs             0x10 16
gs             0x10 16

最佳答案

问题出在我的链接描述文件上。

我正在使用(.rodata),将其更改为(.rodata *)可解决此问题

rodata是可显示字符串存储在ELF文件中的部分,链接器假定在整个内核以0x100000链接时,它应偏移到0。


  GCC将标记为const的全局变量放在称为.rodata的单独部分中。 .rodata也用于存储字符串常量。
  
  由于.rodata节的内容不会被修改,因此可以
  放在Flash中。链接器脚本必须进行修改以适应此情况。

09-25 19:14