我试图将我的python c模块交叉编译为ARM(beaglebone-black具体)。一切似乎都没问题,但我无法将其正确导入到我所假设的链接器运行时问题中。
root@beaglebone:~# python3
Python 3.4.2 (default, Oct 8 2014, 14:38:51)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mypackage
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /usr/local/lib/python3.4/dist-packages/mypackage.cpython-34m.so: cannot open shared object file: No such file or directory
root@beaglebone:~# ldd /usr/local/lib/python3.4/dist-packages/mypackage.cpython-34m.so
libstdc++.so.6 => not found
libgcc_s.so.1 => /lib/arm-linux-gnueabi/libgcc_s.so.1 (0xb6e88000)
libc.so.6 => /lib/arm-linux-gnueabi/libc.so.6 (0xb6d42000)
/lib/ld-linux.so.3 (0xb6ef9000)
root@beaglebone:~# ls -l /usr/local/lib/python3.4/dist-packages/
-rw-r--r-- 1 debian admin 244 Nov 27 12:19 mypackage.egg-info
-rwxr-xr-x 1 debian admin 698298 Nov 27 12:19 mypackage.cpython-34m.so
-rwxrwxrwx 1 root root 641216 Nov 27 12:29 libstdc++.so.6
root@beaglebone:~# ldconfig -p |grep libstd*
libstdc++.so.6 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6
root@beaglebone:~# file /usr/local/lib/python3.4/dist-packages/mypackage.cpython-34m.so
/usr/local/lib/python3.4/dist-packages/mypackage.cpython-34m.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x9a03edac27af0002b195cc47ddc5396f80cb1366, not stripped
root@beaglebone:~# file /usr/local/lib/python3.4/dist-packages/libstdc++.so.6
/usr/local/lib/python3.4/dist-packages/libstdc++.so.6: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x8aed4dbc737c88ee5428052996d7657298dd0952, stripped
编辑回答以下问题:
root@beaglebone:~# readelf -A /usr/local/lib/python3.4/dist-packages/mypackage.cpython-34m.so
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "5T"
Tag_CPU_arch: v5T
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
root@beaglebone:~# readelf -A /usr/lib/arm-linux-gnueabihf/libstdc++.so.6
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_FP_arch: VFPv3-D16
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
Tag_ABI_VFP_args: VFP registers
Tag_ABI_optimization_goals: Aggressive Speed
Tag_CPU_unaligned_access: v6
Tag_DIV_use: Not allowed
root@beaglebone:~# readelf -A /lib/arm-linux-gnueabi/libc.so.6
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "4T"
Tag_CPU_arch: v4T
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_rounding: Needed
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_align_preserved: 8-byte, except leaf SP
Tag_ABI_enum_size: int
答案 0 :(得分:0)
您的系统似乎是硬浮点。 hardfp和softfp之间的区别很好地总结了here。
-mfloat-abi=name
Specifies which floating-point ABI to use. Permissible values are: ‘soft’, ‘softfp’
and ‘hard’.
Specifying ‘soft’ causes GCC to generate output containing library calls for
floating-point operations. ‘softfp’ allows the generation of code using hardware
floating-point instructions, but still uses the soft-float calling conventions.
‘hard’ allows generation of floating-point instructions and uses FPU-specific
calling conventions.
The default depends on the specific target configuration. Note that the hard-float
and soft-float ABIs are not link-compatible; you must compile your entire program
with the same ABI, and link with a compatible set of libraries.
最后一段说明通常hardfp和softfp不兼容链接。当您执行python解释器(硬浮点)时,动态链接器会尝试加载{float}共享对象mypackage.cpython-34m.so
并失败。
执行ldd:
时 ldd /usr/local/lib/python3.4/dist-packages/mypackage.cpython-34m.so
在softfp共享对象上,结果如下:
libstdc++.so.6 => not found
libgcc_s.so.1 => /lib/arm-linux-gnueabi/libgcc_s.so.1 (0xb6e88000)
libc.so.6 => /lib/arm-linux-gnueabi/libc.so.6 (0xb6d42000)
/lib/ld-linux.so.3 (0xb6ef9000)
链接器中可见的libstdc++.so.6
包括路径(如ldconfig所示)是/usr/lib/arm-linux-gnueabihf/libstdc++.so.6
,它是硬浮点因此不兼容。如果/usr/local/lib/python3.4/dist-packages/libstdc++.so.6
是软浮动(我无法判断您的尝试),我仍然希望以下导出可以解决加载libstdc++.so.6
的问题。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/python3.4/dist-packages/
/lib/arm-linux-gnueabi/libc.so.6
是软浮动,它正确加载。为什么你的硬浮动系统上有一个软浮动libc老实说,我无法分辨。
无论如何,要解决python解释器的初始问题,你需要一个硬浮点mypackage.cpython-34m.so
,你需要能够用使用相同ABI编译的库来解决依赖关系。
正如您已经看到的,通过使用gcc/g++
(arm-linux-gnueabihf-gcc-4.7
)的硬浮点版本,您设法修复了运行时链接问题。我再次不确定为什么简单地使用-mfloat-abi=hard
不起作用。它本应该产生一个硬浮点二进制文件,应该已经足够了。