LINUX.ORG.RU

Отыскать Illegal instruction в коде

 , , ,


0

3

Привет. Скомпиленная прога выдает illegal instruction. Но я совсем не могу понять что делать дальше. Вероятно следует отыскать в коде эту инструкцию и что-то делать с этой информацией. Нагуглил следующий способ:

ulimit -c unlimited
sudo sysctl -w kernel.core_uses_pid=1
./program
gdb program core.PID
После чего в gdb записываем
#0  0x000055dfd0b3128b in ?? ()
(gdb) layout asm
После чего должна выписаться на экран нужна инструкция. Однако этого, не происходит, зато выскакивает
Cannot access memory at address 0x55dfd0b3128b
Почему это происходит? Есть ли какой-то способ это обойти и что вообще делать в ситуации с illegal instruction?


Скомпиленная прога выдает illegal instruction. Но я совсем не могу понять что делать дальше.

Очевидно, что компилять прогу с -march=generic. Желательно на всякий случай еще и код показать. Мало ли, что там.

Unicode4all ★★★★★
()
Последнее исправление: Unicode4all (всего исправлений: 1)
Ответ на: комментарий от anonymous

Спасибо, я как раз оттуда и стянул способ, но не обратил внимание на первый ответ. Unicode4all C

-march=generic
выдает ошибку:
error: generic CPU can be used only for -mtune= switch
Код тут(честно говоря не думаю, что это как-то поможет) https://github.com/xmrig/xmrig/tree/master/src/crypto

Я скомпил отдельно от майнера файл CryptoNight.cpp со всеми зависимостями, цель просто завести хэш функцию, скормить ей пару последовательностей и проверить хэши. Флаги компилятора

-march=native -maes -02 --std=c++11

Ladas
() автор топика

Больше похоже на затирание адреса возврата в стеке адресом, указывающим в кучу.

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

Ага, неправильно переписал, каюсь.

deadNightTiger Без -maes не компилится, выдает

error: inlining failed in call to always_inline ‘__m128i _mm_aesenc_si128(__m128i, __m128i)’: target specific option mismatch

-march=native вообще добавил от безысходности, не помогло.

Ladas
() автор топика

Путем нечеловеческих усилий обнаружил, что illegal hardware instruction выскакивает во время вызова функции. Написал простенькую прогу

#include <x86intrin.h>
#include <stdio.h>

int main()
{
    __m128i a;
    a[1] = 0x8899AABBCCDDEEFF;
    a[0] = 0x0123456789ABCDEF;

    const int round = 5;

    __m128i key = _mm_aeskeygenassist_si128( a, round );

    printf("Key value: 0x%016I64x%016I64x\n",
                key[1], key[0]);


    return 0;
}
И действительно, выскакивает та же ошибка. Еще компилятор посоветовал добавить -m32, однако с этим флагом он ругается на отсутствие хэдеров bits/c++config.h, отпишу если получиться решить эту проблему.

Ladas
() автор топика
Ответ на: комментарий от Ladas

Во время вызова функции _mm_aeskeygenassist_si128 конечно же.

Ladas
() автор топика
Ответ на: комментарий от Anoxemian

Я собственно надеялся, что такая реализация уже существует, специально для таких как я.

Ladas
() автор топика
Ответ на: комментарий от mittorn

Я до этого ковырял просто хэш функцию и все было хорошо, но проблема в том, что с недавних пор разработчики Monero немного поправили CryptoNight, и оказалось, что алгоритм с которым я игрался является устаревшим. Судя по гитхабу xmr-stak-cpu не обновлялся около полугода, так что он тоже устарел.

Ladas
() автор топика

Поясните пожалуйста мимослоупоку, почему здесь нельзя AES через OpenSSL пользовать (который сам проверит, есть ли в CPU правильные инструкции и прозрачно софтовую реализацию подтянет если нужно)?

Отчего вообще AES инструкции здесь необходимы - терабайты в наносекунду будут шифроваться?

anonymous
()
Ответ на: комментарий от anonymous

Сработало, правда прога все равно потом сегфолтится, но к счастью уже не в функции хэширования, так что хэши получить удалось.

mittorn, лоханулся я конечно порядочно... Честно говоря даже не подумал о том, чтобы поискать другие реализации. Спасибо за наводку, задача уже решена, но все же в будущем покопаюсь все таки в этом xmr-stackе, от греха подальше.

Ladas
() автор топика
Ответ на: комментарий от anonymous

Поясните пожалуйста мимослоупоку, почему здесь нельзя AES через OpenSSL пользовать

А как это проверить? #include <openssl/aes.h> вместо #include <x86intrin.h> не работает, компилятор ругается на отсутсвтие нужных функций/типов.

Отчего вообще AES инструкции здесь необходимы - терабайты в наносекунду будут шифроваться?

Да видимо не очень то они необходимы, если в других реализациях они не используются.

Ladas
() автор топика
Ответ на: комментарий от Ladas

А как это проверить

Ну OpenSSL не самая обскурная библиотека, а AES - не самый обскурный шифр, примеры есть - https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption

Но я уже сходил по ссылкам и понял, что это про криптовалюты, а у этих товарищей своя атмосфера.

anonymous
()
Ответ на: комментарий от anonymous

Но я уже сходил по ссылкам и понял, что это про криптовалюты, а у этих товарищей своя атмосфера.

Ага, вот кстати ответ на твой вопрос.

Отчего вообще AES инструкции здесь необходимы - терабайты в наносекунду будут шифроваться?

https://monero.stackexchange.com/questions/1110/where-can-i-find-a-descriptio...

This was a brilliantly designed proof-of-work function targeting the strengths of modern CPUs — native AES encryption and fast 64 bit multipliers — tuned to use a scratchpad exactly the size of the per-core L3 cache on Intel CPUs (about 2MB) that someone then wrapped in such a thick blanket of crap it was nearly unrecognizable until you started jumping in, tearing it apart, and putting it back together again.

Ladas
() автор топика
Ответ на: комментарий от Ladas

Они необходимы чтобы майнинг был хоть сколько-то прибыльным. Другие реализации тоже их используют, но просто в некоторых реализациях есть фоллбек на случай их отсутствия

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Уже понял, разобравшись в алгоритме CryptoNight.

Ladas
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.