Assembly 使用动态链接libc启动32位ARM程序集调试时,gdb挂起
我正在Raspberry Pi4(Assembly 使用动态链接libc启动32位ARM程序集调试时,gdb挂起,assembly,arm,gdb,libc,Assembly,Arm,Gdb,Libc,我正在Raspberry Pi4(armv7lCortex-A72架构)上运行Ubuntu20.04 32位服务器。我有一个简单的程序,return.s,如下所示: .section .text .global _start _start: mov r0, #1 mov r7, #1 swi 0 如果排除了libc,我可以在本地组装、运行和调试程序: as -g return.s -o return.o ld return.o -
armv7l
Cortex-A72架构)上运行Ubuntu20.04 32位服务器。我有一个简单的程序,return.s
,如下所示:
.section .text
.global _start
_start: mov r0, #1
mov r7, #1
swi 0
如果排除了libc
,我可以在本地组装、运行和调试程序:
as -g return.s -o return.o
ld return.o -o return
./return; echo $? # result is "1"
gdb return
start # breaks at first line
但如果我将libc
作为动态链接库包含,则调试将挂起:
ld return.o -o return -lc-2.31 \
-dynamic-linker=/usr/lib/arm-linux-gnueabihf/ld-linux-armhf.so.3
./return; echo $? # result is "1"
gdb return
start # hangs
如果使用Ctrl-C中断调试器,则会看到以下回溯:
#0 0xb6fe12fe in ?? () from /usr/lib/arm-linux-gnueabihf/ld-linux-armhf.so.3
#1 0xb6fd81e4 in ?? () from /usr/lib/arm-linux-gnueabihf/ld-linux-armhf.so.3
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
知道发生了什么吗?可以用链接库调试程序吗?如果没有,是否有可用的静态库?您需要使用调试符号重新编译链接库。动态模块加载由默认的
\u start
函数完成,因此如果您要替换它,则不会加载任何动态库,因此没有理由链接它们。不过我认为这并不能解释你的问题。@ColonelThirtyTwo,我正在复制的例子有\u start
。你能给我指出一个使用C库的普通汇编程序吗?我应该改用main
吗?@collonelthirtytwo,当我将\u start
更改为main
时,我得到以下信息:ld:警告:找不到输入符号\u start;默认设置为0001016c
\u start
通常由C编译器自动添加到程序中的启动库提供。如果您使用as
进行编译,那么您就没有这样的奢侈了。我认为您可以使用gcc
使用main
来“只”编译程序集,它将引入适当的库。