【发布时间】:2015-07-20 02:10:42
【问题描述】:
所有讨论都针对 x86。
如果我写了一个简单的 hello 程序,如下所示:
#include <stdio.h>
int main(){
printf("Hello\n");
return 0;
}
然后在我的电脑上用 ubuntu 编译它
$gcc -shared -mPIC -o hello_new hello.c
然后当我尝试执行hello_new 时它会给我分段错误。当我将此二进制文件移动到安卓手机时,同样的错误。 (但我可以用静态链接的 libc 将其编译为二进制文件并在 android 手机上运行)
是的,我想直接执行一个共享对象。
原因如下:
我最近得到了一个别人编译的 linux 文件。当我使用 linux 命令file 和readelf 分析文件时。它说它是一个共享对象(32 位,用 -m32 编译)。但是我可以像在手机上的 android 中的可执行文件一样执行共享对象:
$./hello
这真的让我很困惑。此共享对象文件包含 printf 函数调用,不确定是静态链接还是动态链接。但由于它可以通过 ADB 在 Android 上运行,我假设它与 libc 静态链接。
什么样的编译技术可以让我们直接执行共享对象?
【问题讨论】:
-
您的
gcc是否设置为针对ARM 进行编译?我不认为您可以将 x86 可执行文件移植到 ARMv7a 设备上并期望它能够正常工作。在 x86 android 设备(例如模拟器)上尝试,或者尝试针对目标处理器的架构进行编译。 -
@CPUTerminator,都是 x86。
-
好吧,我没有太多坚实的基础可以继续,也许 gcc 正在使用不受支持的指令/扩展,而不是在 Android 上。看看这个link 虽然方法 1 似乎与您的方法相同,但它针对的是 ARM 架构。也许尝试方法 2 和/或 3?
-
@CPUTerminator,你还需要什么额外的信息?
-
对不起,我措辞不好。我的意思是说我脑子里没有更多的东西(因为我缺乏这个特定方面/主题的知识)。您提供的信息非常完整。查看我发送的链接,它准确地描述了(我的想法)你想要做什么(但对于 ARM,对于 x86 应该是相同的)。