Contact me: hankecnc@gmail.com

在 i586 上构建版本 2.7.8 失败 #228

推推 grbl 3年前 (2023-01-29) 360次浏览
关闭
antohami 打开了这个问题 2017 年 2 月 3 日 · 13条评论
关闭

在 i586 上构建版本 2.7.8 失败#228

antohami 打开了这个问题 2017 年 2 月 3 日 · 13条评论

注释

在 i586 上构建版本 2.7.8 失败 #228
贡献者
安托哈米 评论了 2017 年 2 月 3 日  

在 i586 上构建版本 2.7.8 失败。

Compiling realtime objects/hal/components/clarke2.c
Linking ../rtlib/clarke2.so
`__x86.get_pc_thunk.dx' referenced in section `.text' of objects/clarke2.tmp: defined in discarded section `.text.__x86.get_pc_thunk.dx[__x86.get_pc_thunk.dx]' of objects/clarke2.tmp
collect2: error: ld returned 1 exit status
make: *** [../rtlib/clarke2.so] Error 1

build_2.7.8-i586.txt

在 i586 上构建版本 2.7.8 失败 #228
贡献者作者

在 2.7.5 版本中也转载了。分发 ALT Linux。提示,拜托,可能是什么问题?

在 i586 上构建版本 2.7.8 失败 #228

整洁,RPM,这是新的。

我们经常在 32 位 x86 上为 uspace 构建 2.7,我从未见过这个问题。我的猜测是,这是由于我们的常规构建环境与您正在使用的 RPM 构建环境存在一些差异造成的。

您使用的是哪个版本的 GCC?

您的构建系统运行什么命令来完成所有这些工作?至少配置步骤看起来与我们的常规构建完全不同(此处描述:http: //linuxcnc.org/docs/devel/html/code/building-linuxcnc.html)。configure的时候也有一些error,不知道是不是跟后面的fatal error有关。

在 i586 上构建版本 2.7.8 失败 #228
贡献者作者
安托哈米 评论了 2017 年 2 月 3 日  

您使用的是哪个版本的 GCC?

使用 gcc6。但问题首先出现在 8 月,当时试图构建 2.7.6 版。gcc5时使用。我尝试收集一个gcc5 2.7.5版本。

您的构建系统运行什么命令来完成所有这些工作?

规范链接:http ://git.altlinux.org/people/antohami/packages/?p=linuxcnc.git;a=summary

主要区别在于,在程序集中,我改为使用 autogen.sh autoreconf -fisv

更新:修复链接

在 i586 上构建版本 2.7.8 失败 #228

我一直使用 GCC 6(在 Debian Stretch 上)构建 LinuxCNC 2.7,没有任何问题。

在 i586 上构建版本 2.7.8 失败 #228

我在您评论中的 git.altlinux.org 链接上收到 404。

在 i586 上构建版本 2.7.8 失败 #228
成员
杰普勒 评论了 2017 年 2 月 4 日  

无论到底发生了什么,都可能需要在附近修复:https ://github.com/LinuxCNC/linuxcnc/blob/master/src/Makefile#L995

我们在链接器中使用符号玩奇怪的游戏,以获得类似于在用户空间中导出内核符号的语义。get_px_thunk 符号曾经有一个特例,但我们认为当前的迭代是正确的,没有丢失所有可能架构的所有可能想法。显然不是。

在 i586 上构建版本 2.7.8 失败 #228

我可以在 Debian Stretch、32 位 x86 安装和 GCC 6.3.0-5 上重现这个问题。master 分支构建良好,但 2.7 失败并出现与@midyukov-anton 类似的错误。

在 i586 上构建版本 2.7.8 失败 #228

该区域从 2.7(失败)到 master(未失败)的差异@jepler指向的是这个:

@@ -960,14 +988,13 @@ RTOBJS := $(sort $(foreach mod,$(obj-m),$(call TORTOBJS,$(mod))))
 
 RTDEPS := $(sort $(RTOBJS:.o=.d))
 
-IS_POWERPC = test `uname -m` = ppc -o `uname -m` = ppc64
 modules: $(patsubst %.o,../rtlib/%.so,$(obj-m))
 ../rtlib/%.so:
        $(ECHO) Linking $@
        $(Q)ld -d -r -o objects/$*.tmp $^
-       @if ! $(IS_POWERPC); then objcopy -j .rtapi_export -O binary objects/$*.tmp objects/$*.exp; fi
-       @if ! $(IS_POWERPC); then objcopy -G __x86.get_pc_thunk.bx -G __i686.get_pc_thunk.bx `xargs -r0n1 echo -G < objects/$*.exp | grep -ve '^-G $$' | sort -u` objects/$*.tmp; fi
-       $(Q)$(CC) -shared -Bsymbolic $(LDFLAGS) -o $@ objects/$*.tmp -lm
+       $(Q)objcopy -j .rtapi_export -O binary objects/$*.tmp objects/$*.sym
+       $(Q)(echo '{ global : '; tr -s '\0' < objects/$*.sym | xargs -r0 printf '%s;\n' | grep .; echo 'local : * ; };') > objects/$*.ver
+       $(Q)$(CC) -shared -Bsymbolic $(LDFLAGS) -Wl,--version-script,objects/$*.ver -o $@ $^ -lm
 
 RTFLAGS += -fno-strict-aliasing -fwrapv
 

第二个 objcopy 丢失了,这看起来很可疑,但我对这部分代码的了解还不足以冒险猜测。

在 i586 上构建版本 2.7.8 失败 #228
成员

@SebKuzminsky啊所以它固定在 master 分支?那太棒了。也许我们应该把改变移植回去

在 i586 上构建版本 2.7.8 失败 #228

我挑选了@jepler从 master 到名为 2.7-rtlibs-fix 的新分支的修复 ( f87c024 )。该修复程序使编译在我的 Stretch i386 机器上成功。

这不是一个直接的 cherrypick,我很感激来自@jepler. 与此同时,buildbot 正在我们当前的平台上对其进行测试:http: //buildbot.linuxcnc.org/buildbot/builders/0000.checkin/builds/4739

@midyukov-anton,请试试那个分支。

在 i586 上构建版本 2.7.8 失败 #228
贡献者作者

昨天我能带着补丁在这里集合,正好在我的时区是晚上,我就去睡觉了。

diff --git a/src/Makefile b/src/Makefile
index 2e903e4..9da3e10 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -966,7 +966,7 @@ modules: $(patsubst %.o,../rtlib/%.so,$(obj-m))
 	$(ECHO) Linking $@
 	$(Q)ld -d -r -o objects/$*.tmp $^
 	@if ! $(IS_POWERPC); then objcopy -j .rtapi_export -O binary objects/$*.tmp objects/$*.exp; fi
-	@if ! $(IS_POWERPC); then objcopy -G __x86.get_pc_thunk.bx -G __i686.get_pc_thunk.bx `xargs -r0n1 echo -G < objects/$*.exp | grep -ve '^-G $$' | sort -u` objects/$*.tmp; fi
+	@if ! $(IS_POWERPC); then objcopy -G __x86.get_pc_thunk.bx -G __i686.get_pc_thunk.bx -G __x86.get_pc_thunk.dx `xargs -r0n1 echo -G < objects/$*.exp | grep -ve '^-G $$' | sort -u` objects/$*.tmp; fi
 	$(Q)$(CC) -shared -Bsymbolic $(LDFLAGS) -o $@ objects/$*.tmp -lm
 
 RTFLAGS += -fno-strict-aliasing -fwrapv
diff --git a/src/Makefile.modinc.in b/src/Makefile.modinc.in
index 5ee051c..c0ab54d 100644
--- a/src/Makefile.modinc.in
+++ b/src/Makefile.modinc.in
@@ -120,7 +120,7 @@ IS_POWERPC = test `uname -m` = ppc -o `uname -m` = ppc64
 	$(ECHO) Linking $@
 	$(Q)ld -d -r -o $*.tmp $^
 	$(Q)if ! $(IS_POWERPC); then objcopy -j .rtapi_export -O binary $*.tmp $*.exp; fi
-	$(Q)if ! $(IS_POWERPC); then objcopy -G __x86.get_pc_thunk.bx -G __i686.get_pc_thunk.bx `xargs -r0n1 echo -G < $*.exp | grep -ve '^-G $$' | sort -u` $*.tmp; fi
+	$(Q)if ! $(IS_POWERPC); then objcopy -G __x86.get_pc_thunk.bx -G __i686.get_pc_thunk.bx -G __x86.get_pc_thunk.dx `xargs -r0n1 echo -G < $*.exp | grep -ve '^-G $$' | sort -u` $*.tmp; fi
 	$(Q)$(CC) -shared -Bsymbolic $(LDFLAGS) -o $@ $*.tmp -lm
 endif

今天,我检查了你的补丁
昨天发现这里有一个关于 objcopy 使用的讨论:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59842#c4

在 i586 上构建版本 2.7.8 失败 #228
贡献者作者

2.7-rtlibs-fix 构建成功。谢谢!

在 i586 上构建版本 2.7.8 失败 #228
成员

@SebKuzminsky我只是将该规则的整个文本从 master 分支带入 2.7 而不是试图挑选 – 由于中间版本触发的 docker 错误,它看起来经历了几次修订。特别是,我很惊讶地看到 Makefile 规则中留下了任何 IS_POWERPC 检查。