macOS平台NASM汇编创建Socket无效果,C代码正常的问题排查
我帮你一步步分析可能的问题,毕竟C代码能正常跑,说明逻辑本身没问题,大概率是汇编代码里的细节没处理好:
先确认Socket是否真的创建成功了
你C代码里有tryElse宏检查fd是否错误,但NASM代码里完全没做错误判断!macOS的syscall如果失败,会在rax寄存器返回负的错误码(比如-1对应EPERM,-2对应ENOENT之类的)。你可以在syscall之后加一段检查逻辑,比如:syscall ; 检查返回值是否小于0(创建失败) cmp rax, 0 jl .socket_fail ; 保存文件描述符到rbx,方便后续调试 mov rbx, rax然后加个错误处理的分支,用write syscall把错误信息输出到stderr,这样就能知道Socket是不是根本没创建出来。
检查
pauseHere宏的实现是否正确
如果你的pauseHere宏没正确让进程暂停,程序可能直接退出了,你还没来得及用lsof查询就没了。macOS下pause的syscall号是0x2000022(x86_64架构),正确的宏实现应该是:%macro pauseHere 0 mov rax, 0x2000022 syscall %endmacro要是宏里的syscall号错了(比如用了Linux的号),进程会直接退出,自然看不到Socket。
确认编译链接的方式没出错
汇编代码的编译链接细节很重要:- 用NASM编译时要指定macho64格式:
nasm -f macho64 your_code.asm -o your_code.o - 链接时最好指定macOS最低版本(避免新系统兼容性问题):
ld -o your_program your_code.o -macosx_version_min 10.15 - 如果你的
pauseHere是调用libc的pause函数,那得用gcc链接(ld默认不链libc):gcc -o your_program your_code.o
- 用NASM编译时要指定macho64格式:
验证你查lsof用的PID是否正确
有时候可能手滑拿错了PID,或者程序已经意外退出了。运行汇编程序后,先执行ps aux | grep your_program确认进程确实在运行,再用正确的PID去跑lsof -i -a -p <PID>。
另外补充下:你用的Socket syscall号0x2000097是对的(macOS x86_64下SYS_socket的号是0x97,加上0x2000000的架构前缀),参数AF_INET=2、SOCK_STREAM=1、protocol=0也和C代码一致,这部分没问题。
备注:内容来源于stack exchange,提问作者Arthur Andrade

