Не могу инициализировать глобальные переменные вне функций - PullRequest
1 голос
/ 03 июня 2019

У меня есть этот код:

char* vidmem = (char*)0xb8000;

int main()
{
    vidmem[0] = 'x';
}

но это действует как vidmem не инициализируется. если вместо этого я делаю что-то вроде этого:

char* vidmem;

int main()
{
    vidmem = (char*)0xb8000;

    vidmem[0] = 'x';
}

это работает отлично. Почему?

Я использую эти строки для компиляции и ссылки:

gcc -c main.c -o main.o -ffreestanding -fno-exceptions -m64
gcc -m64 -Wl,--build-id=none -static -nostdlib -nodefaultlibs -lgcc main.obj [...] -T linker.ld -o out.bin

используя этот файл компоновщика:

ENTRY(_start)

SECTIONS
{
    . = 0x7C00;

    .bss :
    {
        *(.bss);
    }

    .text :
    {
        *(.text);
    }
}

На самом деле есть некоторый ассемблерный код, вызывающий этот C-файл, но это не должно иметь значения. Я делаю что-то не так с gcc? Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Вы не добавили свои секции data или rodata в свой скрипт компоновщика. Проверьте файл main.o на наличие раздела vidmem и убедитесь, что вы правильно настроили его в своем скрипте.

0 голосов
/ 03 июня 2019

Необходимы не только разделы в связанном файле, но и код инициализации, который будет копировать данные.

В связанном скрипте вы также должны показать там, чтобы поместить данные, и там хранятся значения в памяти RO (после закрывающей скобки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...