为什么ld链接器对指针和数组的工作方式不同?

问题描述 投票:0回答:1

我有这样的 asm 码。

format ELF

public _start
extrn _kernel_main

section ".text" executable

_start:
    movzx edx, dl
    push edx
    push esi
    push ebx
    call _kernel_main
 @@:
    jmp @b

;section ".data" writable

和这样的ld脚本。

ENTRY(_start)

KERNEL_BASE = 0xFFC00000;

SECTIONS {
    .text KERNEL_BASE : {
        *(.text)
        *(.code)
        *(.rdata*)
    }
    .data ALIGN(0x1000) : {
        *(.data)
    }
    .bss ALIGN(0x1000) : {
        *(.bss)
    }
    .empty ALIGN(0x1000) - 1 : {
        BYTE(0)
    }
} 

这段C代码可以正常工作

void kernel_main() {
    char *screen_buffer = (void*)0xB8000;
    char msg[] = "Hello, World!";
    unsigned int i = 24 * 80;
    screen_buffer[i * 2] = *msg;
    int j = 0;
    while (msg[j] != '\0') {
        screen_buffer[i * 2] = *(msg + j);
        j++;
        i++;
    }   
}

但如果我尝试使用这个代码:

void kernel_main() {
    char *screen_buffer = (void*)0xB8000;
    char *msg = "Hello world!";
    unsigned int i = 24 * 80;
    while (*msg) {
        screen_buffer[i * 2] = *msg;
        msg++;
        i++;
    }
} 

它就停止了正确的执行并且不显示任何字符.

c代码也是一样的。

我看不出这两段代码有什么不同。char msg[] = "你好,世界!"。char *msg = "你好,世界!"。谁能告诉我,我哪里错了。

c assembly linker kernel ld
1个回答
0
投票

我只是跳过了 -c 编译器选项。

gcc src\kernel.c -o bin\main.o -c

-c编译和组装,但不链接。

© www.soinside.com 2019 - 2024. All rights reserved.