我需要部署到Red Hat 4.1.2框(具有gcc 4.1.2)。我在Ubuntu 11.10上使用GCC 4.6.1进行开发。不幸的是,我的构建过程创建的一些二进制文件在RedHat机器上不可用。原因似乎是ABI的变化,根据another Stackoverflow question引起的STT_GNU_IFUNC符号。有没有办法阻止导出任何这样的符号,以便我的二进制文件可以使用旧的ABI?我使用nm在我的二进制文件中查找“i”类型的任何符号,但没有找到。
我问这个是因为我构建的一些其他二进制文件以及一些第三方库(tbb,boost)都没有使用新的ABI,所以在RedHat机器上运行正常。
希望很清楚。提前谢谢。答案 0 :(得分:10)
通常,UNIX系统支持向后二进制兼容性(在旧机器上构建的二进制文件继续在较新的机器上运行),但反之则不然。您不能指望在新系统上构建的二进制文件可以在较旧的系统上运行。 STT_GNU_IFUNC
只是您遇到的许多问题的第一个。
如果您需要在较旧的机器上构建二进制文件,请使用较旧的机器,请参阅this文档。
曾经有过“apgcc:一个GCC包装器来制作便携式二进制文件”,这使得这很容易(从上面引用),但似乎已经消失了; - (
最简单的选择是在旧机器上构建(我曾经在RedHat 6.2上构建,并且生成的二进制文件无处不在)。您不必在物理计算机上实际运行RH-6.2,只需将其置于VM中即可。
另一个相对简单的选择是使用旧版本(例如RH-6.2)中的工具和库再次构建chroot
。
答案 1 :(得分:0)
交叉编译到较旧的Linux可能非常困难,这只是您将遇到的许多问题之一。
也就是说,可以通过添加observations = seq(1, 60)
n = length(observations)
x_bar = mean(observations)
SIGMA = 2
SE = SIGMA / sqrt(n)
x.min = x_bar - 4*SE
x.max = x_bar + 4*SE
Likelihood = function(x) sapply(lapply(x, dnorm, x = observations, SIGMA), prod) # Natural Log??
curve(Likelihood, from = x.min, to = x.max, col = 'red', lwd = 3)
来解决ABI兼容性问题。
答案 2 :(得分:0)
因为APGCC似乎不再可用。这些glibc headers似乎是目前最便捷的方法,通过包含一个较旧的头文件,可以从C代码生成可移植的Linux二进制文件。