我正在编码一个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中。链接器脚本必须进行修改以适应此情况。