You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

st打fix-keyboard-input补丁后经PKGBUILD安装启动报Segmentation fault

问题描述

给suckless推出的st终端应用打补丁时发现,若不直接使用sudo make install命令完成安装,而是编写PKGBUILD通过makepkg -sri命令安装,程序启动时会直接崩溃,返回如下错误:

Segmentation fault (core dumped)

通过git bisect二分法排查定位到,该问题由fix-keyboard-input补丁引发。该补丁自2018年起就未再更新,邮件联系补丁作者获得反馈的概率较低,因此在此寻求问题解决思路。

相关环境信息
  • 操作系统:Archlinux
  • 对应代码提交哈希:520a554f7ce49f70e07f4eac5a89b454c445f6d4
  • AUR包名:utilyre-st-git
构建使用的PKGBUILD内容
pkgname="utilyre-st-git"
_reponame="st"
pkgver="0.8.6"
pkgrel="1"
pkgdesc="A simple virtual terminal emulator for X"
arch=("i686" "x86_64" "armv7h")
url="https://github.com/utilyre/st"
license=("MIT")
depends=("libxft-bgra")
makedepends=("ncurses" "libxext" "git")
provides=("st")
conflicts=("st" "st-git")
source=("git+$url.git")
sha256sums=("SKIP")

build() {
    cd "$_reponame"
    make X11INC="/usr/include/X11" X11LIB="/usr/lib/X11"
}

package() {
    cd "$_reponame"
    make PREFIX="/usr" DESTDIR="$pkgdir" install
    install -Dm644 "LICENSE" "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
    install -Dm644 "README.md" "$pkgdir/usr/share/doc/$pkgname/README.md"
}
问题根因与解决方法

段错误核心原因:fix-keyboard-input补丁存在路径硬编码缺陷,补丁逻辑会在程序运行时直接读取编译阶段源码目录下的config.h文件加载键盘映射规则。

  • 直接执行sudo make install时,本地编译生成的源码目录不会被删除,程序运行时能正常读取到对应路径的config.h,不会触发崩溃。
  • 用makepkg打包安装时,整个编译过程在临时构建目录完成,打包结束后临时目录会被自动清理,程序启动后找不到硬编码路径下的配置文件,触发空指针访问直接崩溃。

修复方案可选以下任意一种:

  1. 修改fix-keyboard-input补丁逻辑,移除运行时读取源码目录config.h的设计,把键盘映射相关配置在编译阶段直接写入二进制文件,完全不依赖运行时外部文件读取。
  2. 调整补丁的配置读取逻辑,按优先级先后读取~/.config/st/config.h(用户级配置)、/usr/share/st/config.h(系统级配置);同时在PKGBUILD的package()阶段新增安装步骤,把编译用到的config.h安装到对应系统目录。
  3. 不想大改补丁的话,直接给源码打个小补丁,把硬编码的源码路径替换为系统固定配置路径,再在PKGBUILD里把config.h安装到对应路径即可。

内容的提问来源于stack exchange,提问作者user17428817

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 07:06:35