树莓派开机桌面自启脚本无法启动C无头应用,Shell运行正常
树莓派3B+开机自启C++无头应用失败问题
环境与配置
- 硬件:树莓派3B+
- 系统:Raspberry OS Buster
- 自启配置:通过
/etc/xdg/autostart/myScript.desktop实现桌面登录后自启,文件内容:
$ cat /etc/xdg/autostart/myScript.desktop [Desktop Entry] Type=Application Name=Some Description Exec=/opt/myDir/launchMyApp.sh StartupNotify=true
权限配置:
$ ls -l /opt/myDir/launchMyApp.sh -rwxr-xr-x 1 pi root 3373 Mar 13 16:29 /opt/myDir/launchMyApp.sh $ ls -l /opt/ | grep myDir rwxr-xr-x 4 pi root 4096 Mar 13 16:29 myDir $ ls -l /opt/myDir/myExec -rwxrwxr-x 1 pi pi 71272 Mar 13 12:48 /opt/myDir/myExec
启动脚本/opt/myDir/launchMyApp.sh(简化版):
#!/usr/bin/env bash ulimit -c unlimited LOG_FILE=/tmp/mylog.log cd /opt/myDir || { printf "[err] unable to cd to /opt/myDir\n" >> ${LOG_FILE} 2>&1; exit 1; } printf "[inf] log start: `date \"+%Y-%m-%d %H:%M:%S\"` at ${PWD} by `whoami`\n" > ${LOG_FILE} 2>&1 (./myExec 1 2 &) (/usr/bin/chromium-browser --start-fullscreen http://1.2.3.4/whatever &) exit 0
异常现象
- 开机登录桌面后,
chromium-browser可正常启动,但myExec完全无法运行 - 脚本日志
/tmp/mylog.log仅输出启动信息,无任何错误或运行日志:
$ cat /tmp/mylog.log [inf] log start: 2023-03-13 16:38:50 at /opt/myDir by pi
myExec在pi用户手动登录Shell后可正常运行,但自启时即使在main函数开头添加日志代码也无日志生成,无core文件输出
排查尝试
- 尝试多种启动方式:
nohup ./myExec、(./myExec)、$(./myExec)、./myExec &等,均无效 - 编写测试程序
helloWorld,与myExec同目录、同权限、同编译器编译,可正常自启并生成日志:
#include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { FILE* f = fopen("/opt/myDir/log/hello.log", "w"); char params[16] = ""; if(NULL != f) { snprintf(params, sizeof(params), "1[%s] 2[%s]\n", argv[1], argv[2]); fwrite(params, 1, sizeof(params), f); fclose(f); } return 0; }
- 将上述日志代码复制到
myExec的main函数最开头重新编译,仍无日志生成 - 创建会触发段错误的测试程序,添加
ulimit -c unlimited后可正常生成core文件,但myExec依旧无任何输出 - 通过
file命令查看文件类型:core、helloWorld、myExec均为:ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, ...- 其他正常可执行文件为:
ELF 32-bit LSB executable, ARM, EABI5 version 1 ...
编译信息
主机为x86_64 Ubuntu Xenial,交叉编译命令如下:
编译阶段
/usr/bin/arm-linux-gnueabihf-g++ -std=c++11 -Wabi-tag -D_GLIBCXX_USE_CXX11_ABI=0 -DFLAG1 \ -DFLAG2 -fexceptions --sysroot=/opt/rpi/sysroot/bld -Wno-deprecated -Wno-format-truncation \ -Wno-unused-result -O0 -g -DDEBUG -I/opt/dependencies/dependency01/dist/linux/armhf/include \ -I/opt/rpi/sysroot/bld/opt/vc/include \ -I/opt/rpi/sysroot/bld/usr/include/arm-linux-gnueabihf \ -I/opt/rpi/sysroot/bld/usr/include \ -I/opt/rpi/sysroot/bld/usr/local/include \ -c File.cpp -o obj/linux/armhf/debug/File.o
其中--sysroot指向挂载的Buster镜像
链接阶段
/usr/bin/arm-linux-gnueabihf-g++ -L/opt/rpi/sysroot/bld/opt/vc/lib \ -L/opt/rpi/sysroot/bld/usr/lib/arm-linux-gnueabihf \ -L/opt/rpi/sysroot/bld/usr/lib/gcc/arm-linux-gnueabihf/8 \ -L/opt/rpi/sysroot/bld/lib -L/opt/rpi/sysroot/bld/usr/lib \ -L/opt/dependencies/dependency01/dist/linux/armhf/dbg/lib \ -o dist/linux/armhf/dbg/myExec \ obj/linux/armhf/dbg/file1.o obj/linux/armhf/dbg/file2.o ... \ --sysroot=/opt/rpi/sysroot/bld -lextdep1 -lextdep2 -ldependency01
补充信息(编辑1)
- 回滚到旧版本代码,使用Xenial x86_64的gcc 5.4.0交叉编译后,
myExec可正常自启 - 同一代码版本下,使用Fossa x86_64的gcc 9.4.0编译时:
- 需添加
-L$(CHROOT)/usr/lib/gcc/arm-linux-gnueabihf/8解决pow函数找不到的问题 - 需添加
-no-pie才能链接为可执行文件 - 编译后的程序仍无法自启
- 需添加
内容的提问来源于stack exchange,提问作者vesperto
相关产品推荐
相关产品推荐

