Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 使用动态链接libc启动32位ARM程序集调试时,gdb挂起_Assembly_Arm_Gdb_Libc - Fatal编程技术网

Assembly 使用动态链接libc启动32位ARM程序集调试时,gdb挂起

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 -

我正在Raspberry Pi4(
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
来“只”编译程序集,它将引入适当的库。