libcrypto.so.1.0.0在ARM上不能gdb调试问题

问题:

(gdb) r
Starting program: /home/root/robot -term
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/arm-linux-gnueabihf/libthread_db.so.1".

Program received signal SIGILL, Illegal instruction.
0xb6a5cd88 in ?? () from /usr/lib/arm-linux-gnueabihf/libcrypto.so.1.0.2

原因:

this is by design in openssl, from https://www.openssl.org/docs/faq.html#PROG15:

OpenSSL adapts to processor it executes on and for this reason has to query its capabilities. Unfortunately on some processors the only way to achieve this for non-privileged code is to attempt instructions that can cause Illegal Instruction exceptions. The initialization procedure is coded to handle these exceptions to manipulate corresponding bits in capabilities vector. This normally appears transparent, except when you execute it under debugger, which stops prior delivering signal to handler. Simply resuming execution does the trick, but when debugging a lot it might feel counterproductive. Two options. Either set explicit capability environment variable in order to bypass the capability query (see corresponding crypto/*cap.c for details). Or configure debugger not to stop upon SIGILL exception, e.g. in gdb case add 'handle SIGILL nostop' to your .gdbinit.

解决办法:

添加gdb选项

(gdb) handle SIGILL nostop

参考:

https://github.com/termux/termux-packages/issues/1660

Tags:,