__ неопределенный udivdi3 — как найти код, который использует его?

Один из способов сделать это было бы с git rev-list. Следующее будет выводить коммит, на который указывает тег:

$ git rev-list -n 1 $TAG

Вы можете добавить его в качестве псевдонима в ~/.gitconfig, если вы его много используете:

[alias]
  tagcommit = rev-list -n 1

И затем позвоните с помощью:

$ git tagcommit $TAG
18
задан Jonathan Leffler 27 November 2015 в 23:13
поделиться

3 ответа

Во-первых, вы можете выполнить 64-битное деление с помощью макроса do_div . (обратите внимание, что прототипом является uint32_t do_div (uint64_t divisor, uint32_t divisor) и что « divisor » может оцениваться несколько раз.

{
    unsigned long long int x = 6;
    unsigned long int y = 4;
    unsigned long int rem;

    rem = do_div(x, y);
    /* x now contains the result of x/y */
}

Кроме того, вы можете найти применение типов long long int (или uint64_t ) в вашем коде, либо вы можете создать свой модуль с флагом -g и использовать objdump -S , чтобы получить аннотированный исходный код дизассемблирования.

примечание: это применимо к ядрам 2.6, я не проверял использование для чего-либо ниже

21
ответ дан 30 November 2019 в 08:16
поделиться

После этапа компиляции вы сможете получить некоторую задокументированную сборку и посмотреть, вызываются ли эти функции. Попробуйте поиграть с CFLAGS и добавить флаги -S. Компиляцию следует остановить на этапе сборки. Затем вы можете найти вызывающую ошибку в файле сборки с помощью grep.

4
ответ дан 30 November 2019 в 08:16
поделиться

Фактически, 64-битное целочисленное деление и модуль поддерживаются в 32-битном ядре Linux; однако для этого вы должны использовать правильные макросы (которые зависят от версии вашего ядра, так как недавно были созданы новые лучшие макросы IIRC). Макросы будут делать правильные вещи наиболее эффективным способом для любой архитектуры, для которой вы компилируете.

Самый простой способ найти, где они используются, - это (как упоминалось в ответе @ shodanex) сгенерировать ассемблерный код; IIRC, способ сделать это - что-то вроде make directory / module.s (вместе с любыми параметрами, которые вы уже должны передать в make ). Следующий простой способ - дизассемблировать файл .o (например, objdump --disassemble ).

3
ответ дан 30 November 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: