- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的 Linux x86_64 主机上,我正在尝试为我的 PowerPC 目标交叉编译一些额外的 Python 模块,特别是 greenlet , gevent , 和 gevent-websockets .目前,我只是试图交叉构建 greenlet 模块。
使用本网站的信息:
http://randomsplat.com/id5-cross-compiling-python-for-embedded-linux.html
我能够使用此设置为我的构建环境交叉编译 Python 2.7.2
# Undo variables for cross-compile environment
unset ROOT
unset SDKDIR
unset KLIBDIR
unset NFSDIR
unset CONFIG
unset CONFIGURED
unset ARCH
unset OS
unset TOOLCHAIN_BASE
unset TOOLCHAIN_BIN
unset CROSS_COMPILE
unset c
unset KERNEL_DIR
unset AS
unset LD
unset CC
unset AR
unset STRIP
unset SSTRIP
unset OBJCOPY
unset OBJDUMP
unset MAKE
unset CFLAGS
# Set cross-compile variables:
export TOOLCHAIN=/opt/freescale/usr/local/gcc-4.3.74-eglibc-2.8.74-dp-2/powerpc-none-linux-gnuspe/bin/powerpc-none-linux-gnuspe-
export CC=${TOOLCHAIN}gcc
export CXX=${TOOLCHAIN}g++
export AR=${TOOLCHAIN}ar
export RANLIB=${TOOLCHAIN}ranlib
export BLDSHARED="${TOOLCHAIN}gcc -shared"
export LDSHARED="${TOOLCHAIN}gcc -shared"
export RFS="../../ltib/rootfs"
export CFLAGS="-save-temps -Wall -I${RFS}/usr/include -I${RFS}/include/python2.7 -L${RFS}/usr/lib -L${RFS}/lib"
export LDFLAGS="-I${RFS}/usr/include -I${RFS}/include/python2.7 -L${RFS}/usr/lib -L${RFS}/lib"
export CROSS_COMPILE=ppc-linux
export CROSS_COMPILE_TARGET=yes
export HOSTARCH=ppc-linux
export BUILDARCH=x86_64-linux-gnu
使用上述脚本配置我的环境,然后尝试构建 greenlet 模块:
$ python ./setup.py build
running build
running build_ext
building 'greenlet' extension
creating build
creating build/temp.linux-x86_64-2.7
/opt/freescale/usr/local/gcc-4.3.74-eglibc-2.8.74-dp-2/powerpc-none-linux-gnuspe/bin/powerpc-none-linux-gnuspe-gcc -I../../../ltib/rootfs/usr/include -L../../../ltib/rootfs/usr/lib -L../../../ltib/rootfs/lib -fPIC -I/usr/include/python2.7 -c greenlet.c -o build/temp.linux-x86_64-2.7/greenlet.o
In file included from /usr/include/python2.7/Python.h:58,
from greenlet.h:8,
from greenlet.c:5:
/usr/include/python2.7/pyport.h:849:2: error: #error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)."
error: command '/opt/freescale/usr/local/gcc-4.3.74-eglibc-2.8.74-dp-2/powerpc-none-linux-gnuspe/bin/powerpc-none-linux-gnuspe-gcc' failed with exit status 1
为什么 setup.py 从我的主机系统上的 /usr/include/python2.7
拉取?我在我的目标上找不到那个目录。如何为我的目标创建它?
有什么建议吗?
谢谢!
特雷弗
我对主机的目标 rootfs 副本的相对引用不正确。更正它并重新运行产量:
$ python ./setup.py build
running build
running build_ext
building 'greenlet' extension
creating build
creating build/temp.linux-x86_64-2.7
/opt/freescale/usr/local/gcc-4.3.74-eglibc-2.8.74-dp-2/powerpc-none-linux-gnuspe/bin/powerpc-none-linux-gnuspe-gcc -save-temps -Wall -I../../ltib/rootfs/usr/include -I../../ltib/rootfs/include/python2.7 -L../../ltib/rootfs/usr/lib -L../../ltib/rootfs/lib -fPIC -I/usr/include/python2.7 -c greenlet.c -o build/temp.linux-x86_64-2.7/greenlet.o
greenlet.s: Assembler messages:
greenlet.s:832: Error: syntax error; found `(' but expected `,'
greenlet.s:832: Error: junk at end of line: `(31),1'
error: command '/opt/freescale/usr/local/gcc-4.3.74-eglibc-2.8.74-dp-2/powerpc-none-linux-gnuspe/bin/powerpc-none-linux-gnuspe-gcc' failed with exit status 1
至少它找到了我目标的更多包含库,但现在我真的很困惑! :(
还有什么建议吗?
谢谢!
通过向编译器添加 -save-temps
标志(更新了上面的错误),我能够保存并检查上面错误消息中提到的中间汇编代码。虚线是:
#APP
# 52 "platform/switch_ppc_linux.h" 1
mr 8(31), 1
# 0 "" 2
MR(移动寄存器)操作相当简单,只接受 2 个参数(mr to-reg, from-reg
)。我不知道带有附加寄存器号的括号是如何添加的。 FWIW,这是上面头文件中引用的宏:
#define STACK_REFPLUS 1
#ifdef SLP_EVAL
#define STACK_MAGIC 3
/* !!!!WARNING!!!! need to add "r31" in the next line if this header file
* is meant to be compiled non-dynamically!
*/
#define REGS_TO_SAVE "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", \
"r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", \
"cr2", "cr3", "cr4"
static int
slp_switch(void)
{
register int *stackref, stsizediff;
__asm__ volatile ("" : : : REGS_TO_SAVE);
__asm__ ("mr %0, 1" : "=g" (stackref) : );
{
SLP_SAVE_STATE(stackref, stsizediff);
__asm__ volatile (
"mr 11, %0\n"
"add 1, 1, 11\n"
"add 30, 30, 11\n"
: /* no outputs */
: "g" (stsizediff)
: "11"
);
SLP_RESTORE_STATE();
}
__asm__ volatile ("" : : : REGS_TO_SAVE);
return 0;
}
#endif
我开始怀疑这是否是编译器中的错误,因为宏看起来很简单!有什么建议么? ...谢谢!
最佳答案
也许你应该问一个新问题,因为这里确实(至少)有两个完全独立的问题。但是,看看你的第二个问题:
__asm__ ("mr %0, 1" : "=g" (stackref) : );
这是错误的。我将在下面解释原因,但首先,以下更改可能会修复它:
__asm__ ("mr %0, 1" : "=r" (stackref) : );
您可能还需要将下面的 "g"(stsizediff)
更改为 "r"(stsizediff)
。
那么,现有版本有什么问题?首先看一下stackref是怎么定义的:
register int *stackref, stsizediff;
register
是对编译器的提示,表示您认为如果它为 stackref
分配一个寄存器而不是使用堆栈位置,它可能会使事情变得更快或更好,不是要求。如果 stackref
以 R12 结尾,那很好;如果它最终进入堆栈帧 8 个字节,那也很好。只要不违反任何约束,两者都是完全合法的。
那么,stackref
有哪些限制?唯一的一个是在上面引用的那个 asm block 中。您将 "=g"(stackref)
作为输出操作数。 =
表示它是只写约束,g
表示它必须在寄存器、内存位置或立即值中。
所以编译器没有做错任何事。它从堆栈中分配 stackref
8 个字节,这与约束相匹配(这是一个内存位置),然后用该值代替 "%0"
,您得到:
mr 8(31), 1
这并没有错——直到您尝试对其进行汇编,并且汇编程序注意到您正在尝试将 8(31) 与仅采用寄存器的操作码一起使用。但问题不在于编译器或汇编器,而在于代码。你要求它使用 stackref
作为 mr
的操作数,并且没有强制 stackref
成为寄存器,所以你得到了你所要求的为。
无论如何,将 "=g"
更改为 "=r"
会将约束从“任何寄存器、内存位置或立即值”更改为“任何通用寄存器” ”。这意味着编译器必须将 stackref
放在通用寄存器中。或者,如果由于某种原因它不能,它会失败并告诉您原因,而不是生成不会组装的程序集。
那么,为什么这对原作者有效?好吧,他可能很幸运,stackref
被分配给了,比如说,R12,而不是堆栈帧中的 8 个字节,所以他最终得到了 mr 12, 1
,组装得很好。
或者,还有一种可能。查看 git 树,看起来代码是在 Mac OS X 上开发的,然后在十年前移植到 AIX(主要是 Mac 开发人员),然后逐字从 AIX 复制到 linux(甚至留下描述“Port for AIX on PowerPC"),此后就没有太大的变化了。当时 OS X 和 AIX 都只有 gcc 3。所以,也许这就是当时它对每个人都有效但对你不起作用的原因。也许只需要一个较旧的交叉编译器就可以解决您的问题。但我会先尝试修复代码。
关于python - 在 Linux x86_64 for PowerPC 上交叉编译 Python 的 greenlet 和 gevent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11587635/
过去几天我一直试图解决这个问题,但我做不到。我正在尝试生成 _ _ _ 形式的随机数。 _ _ _ _ 小数点前 3 位,然后是 4 位小数。 非常感谢任何帮助。谢谢, 院长 最佳答案 您发布的代码有
我的方法有问题。我需要从主类调用的方法的输出打印我: 需要这个输出:_ _ _ _ _ 我知道我可以将 System 的静态方法放入循环中,但这不是我想要的解决方案。我需要它来打印主类中方法的输出。
我正在学习 Scala,有一个非常基本的问题。考虑以下两个使用占位符语法的表达式 - // Syntax A val fnA = (_: Int, _: Int) => _ / _ // Synta
我正在使用图书馆 URLEmbeddedView 它在其库中定义了以下代码: func addConstraints(with view: UIView, center: CGPoint, multi
我一直在许多受人尊敬的文档中看到这个相当令人尴尬的事情:_|_ 或 (_|_) 找不到它的定义(Google 不能很好地处理符号)。那到底是什么呢? 最佳答案 来自 here :- Bottom Th
,_,( ){ ,_,| ,_,&};,_, 不知道是什么意思... 看起来像一个 bash 命令,但它可能是 s bash shell 指令或其他东西如果有人可以帮助理解这一点,我们将不胜感激。当我
所以我正在尝试构建一个函数,它接受一个元组列表并找到具有最大第二个元素的元组。但是我遇到了模式匹配错误。 这是我的代码。 resultTuple :: [((Int,Int),Int)] ->
我在 try Flow 编辑器中重现了我的情况,可以访问 here . 以下是链接发生问题时的代码: /* @flow */ type PayloadType = 1 | 2 | 3; type Tr
我在plfa读到这样一段代码。 import Relation.Binary.PropositionalEquality as Eq open Eq using (_≡_; refl; cong; s
这个问题在这里已经有了答案: Swift 3.0: compiler error when calling global func min(T,T) in Array or Dictionary e
是否有理由使用一个而不是另一个?似乎 _.some 和 _.map 更易于使用或适用于更多情况(根据我非常有限的经验),但从阅读它来看,它们听起来好像应该做同样的事情。我敢肯定还有其他这样的例子,我很
在 Xcode 7 Beta 中开始使用 Swift 2 后,出现错误 cannot invoke。是什么导致了这个问题? 我试图通过以下两个问题找出我的问题,但我仍然收到错误:Question 1
所以我玩了一会儿,试图写一些关于存在和变化的东西,我遇到了这段有趣的代码。 final case class Box[+T](val value: T) { def >>=[U](f: T =>
Here is the screenshot for the error. 遵循本教程 https://developers.google.com/places/ios-api/start 在本教程中
我正在为许多标准的 Underscore.js 函数重写底层代码,以提高我的 JavaScript 技能,但我有点受困于 _.every/ _.全部。似乎在库本身中,_.every/_.all 函数仅
我在 shell 脚本中多次看到他们在 if 比较中使用 "_",如下所示: if [ "_$str" = "_" ]; then ....; fi 上面的代码通过比较 if [ "_$str"= "
我正在尝试快速过滤字典: var data: [String: String] = [:] data = data.filter { $0.1 == "Test" } 上面的过滤器代码在 Swift
我在 Entity Framework 核心映射方面遇到了问题。我收到此异常“不支持从‘付款’到‘购买。付款’的关系,因为拥有的实体类型‘购买’不能位于非所有权关系的主要方面。”在调试此功能的测试时。
我正在尝试模拟groovy.sql.Sql调用(查询,params [],闭包)类。 下面是我正在尝试在DatabaseService类文件中的方法。 public void getUsers(Lis
在阅读 dart 代码时,我经常看到一些仅使用下划线 _ 参数调用的函数。这让我困扰了一段时间,由于 flutter 改进了它的分析消息,我有了一些线索......但我觉得我并没有真正理解这个概念:-
我是一名优秀的程序员,十分优秀!