неопределенная ссылка на `_memset64' при создании массива структур в DMD с параметром -betterC

Я новичок в D и пытаюсь создать массив структур с активным -betterC, но продолжаю сталкиваться с этой ошибкой:

/home/xander/Documents/lithium/kernel/kernel.main.d:17: undefined reference to `_memset64'

когда я пытаюсь связать его. Вот оскорбительная строка:

idt_entry[256] idtr;

Я не нашел эту ошибку с gdc, но для моего проекта требуется доступ к встроенной сборке, поэтому вернуться назад не вариант.

Ссылка на репо: Omega0x013/lithium


d dmd
person Alexander Bielby    schedule 08.06.2020    source источник
comment
Очевидно, это известная ошибка с dmd; вы пробовали LDC2, а?   -  person Putnam    schedule 08.06.2020
comment
ошибка становится memset вместо _memset64   -  person Alexander Bielby    schedule 08.06.2020
comment
Глупый обходной путь, который приходит на ум, учитывая сообщение об ошибке, заключается в создании пустого массива с элементами sizeof(idt_entry)*256, которые вы затем приводите к idt_entry[256], но это очень хакерский и раздражающий способ обойти ошибки компилятора.   -  person Putnam    schedule 08.06.2020
comment
говорит, что нет инициализатора по умолчанию для void и отказывается компилировать   -  person Alexander Bielby    schedule 08.06.2020
comment
я нашел еще более хакерский обходной путь :) byte[idt_entry.sizeof*256] _idtr; auto idtr = cast(idt_entry[])_idtr;   -  person Alexander Bielby    schedule 08.06.2020
comment
Я настоятельно рекомендую вам не использовать DMD и вместо этого придерживаться LDC или GDC. У них гораздо более проверенный и производительный генератор кода, и они поддерживают гораздо больше платформ. Информация об отладке, которую они генерируют, также будет намного лучше, и у них есть поддержка для вашего варианта использования (голое железо).   -  person Geod24    schedule 10.06.2020


Ответы (2)


Я думаю, что определение функции решит вашу проблему. источник из здесь

extern (C) long *_memset64(long *p, long value, size_t count)
{
    long *pstart = p;
    long *ptop;

    for (ptop = &p[count]; p < ptop; p++)
        *p = value;
    return pstart;
}
person raoof    schedule 18.06.2020

Компиляторы D, как и многие компиляторы (на ум приходят GCC и clang), обнаружат некоторые шаблоны и способы использования и сгенерируют функции вызова кода из стандартной библиотеки, которые отражают этот шаблон и могут делать это потенциально более эффективно, учитывая, что стандартные библиотечные функции часто значительно оптимизируется, а в некоторых случаях используются нишевые аппаратные расширения для конкретных машин, такие как функции с ускорением AVX.

В вашем случае, поскольку это автономный код (факт, который вы не очень хорошо скрывали, учитывая, что это структура IDT x86 :D), стандартная библиотека недоступна, и вы не можете ссылаться на нее, но это что-то, чего компилятор не знает, поэтому он все равно будет генерировать вызов функции, поэтому ваша работа как программиста - предоставить это!

Этот ответ предоставляет функцию вставки для реализации, но я думаю, что некоторые рассуждения были связаны с тем, что никогда не стоит копировать код без понимание своего предназначения!

person Rottenheimer2    schedule 01.11.2020