Alpine编译Buildroot的host-fakeroot出错,求解决方案
Alpine编译Buildroot host-fakeroot失败的解决办法
最优处理方案:适配musl的条件编译补丁
根因是musl移除了xattr接口的64后缀,而fakeroot默认使用带64后缀的glibc接口。直接给host-fakeroot加个针对musl的宏映射补丁即可解决,不会引入额外问题:
- 新建补丁文件
package/fakeroot/0001-libfakeroot-adapt-musl-xattr-symbols.patch,内容如下:diff --git a/libfakeroot.c b/libfakeroot.c index xxxxxxx..yyyyyyy 100644 --- a/libfakeroot.c +++ b/libfakeroot.c @@ -1,3 +1,10 @@ +#ifdef __musl__ +#define SEND_GET_XATTR64 SEND_GET_XATTR +#define SEND_LIST_XATTR64 SEND_LIST_XATTR +#define SEND_SET_XATTR64 SEND_SET_XATTR +#define SEND_REMOVE_XATTR64 SEND_REMOVE_XATTR +#endif + #include "libfakeroot.h" #include <stdio.h> #include <stdlib.h> - 在
package/fakeroot/fakeroot.mk中添加补丁引用:HOST_FAKEROOT_PATCHES += \ $(BR2_EXTERNAL)/path/to/0001-libfakeroot-adapt-musl-xattr-symbols.patch - 重新执行
make host-fakeroot-rebuild即可完成编译。这个方案只针对musl环境做兼容,不影响其他libc的正常编译。
其他可行补丁方案
方案1:按libc类型分支调用xattr接口
直接修改libfakeroot.c中所有xattr相关的调用逻辑,根据libc类型选择对应接口:
diff --git a/libfakeroot.c b/libfakeroot.c index xxxxxxx..zzzzzzz 100644 --- a/libfakeroot.c +++ b/libfakeroot.c @@ -xxxx,xx +xxxx,xx @@ static int handle_getxattr(int req, struct fake_request *r) { - ret = SEND_GET_XATTR64(r->pid, path, name, value, size, flags); +#if defined(__GLIBC__) && !defined(__UCLIBC__) + ret = SEND_GET_XATTR64(r->pid, path, name, value, size, flags); +#else + ret = SEND_GET_XATTR(r->pid, path, name, value, size, flags); +#endif if (ret == -1) return -1;
同理修改SEND_LIST_XATTR64、SEND_SET_XATTR64、SEND_REMOVE_XATTR64的调用处。这种方式更彻底,但需要修改多处代码。
方案2:禁用fakeroot的xattr支持
如果你的构建不需要fakeroot模拟xattr属性,可以直接关闭该功能:
- 进入Buildroot的
menuconfig,路径为Toolchain → Host utilities → fakeroot,取消勾选Enable xattr support; - 或者直接在
.config中设置BR2_PACKAGE_FAKEROOT_XATTR=n; - 重新编译即可跳过xattr相关代码的编译,从根源上避免错误。
方案3:修复Debian time64补丁的重复符号问题
如果一定要用Debian的time64-on-32bit-archs补丁,可通过链接选项临时绕过重复符号问题:
- 在
package/fakeroot/fakeroot.mk中添加链接参数:HOST_FAKEROOT_CONF_OPTS += LDFLAGS=-Wl,--allow-multiple-definition - 注意:这只是临时 workaround,可能引入其他潜在问题,不建议作为长期解决方案。
内容的提问来源于stack exchange,提问作者asmo
相关产品推荐
相关产品推荐

