我无法运行ELF格式程序。shell告诉我没有这样的文件或目录

时间:2015-06-14 08:50:55

标签: c linux gcc

我的环境是Ubuntu 14 32位 我分别写了三个名为main.c,foo.c和bar.c的c文件 代码很简单。
第一个源代码是main.c

 #include<stdio.h>
 extern void foo();
 int main(){
 foo();
 return 0;
}

第二个源代码是foo.c

#include<stdio.h>
void foo(){
printf("Hi,I am foo.");
bar();
}

最后一个是bar.c

#include<stdio.h>
void bar(){
printf("Hi,I am bar.");
}

以上所有文件都放在名为test的文件夹中 (其绝对路径为/ home / jack / Desktop / test)
然后我发出命令:

$ gcc -fPIC -shared -Wl,-soname,libbar.so.1 -o libbar.so.1.0.0 bar.c
$ ln -s libbar.so.1.0.0 libbar.so
$ gcc -fPIC -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0.0 foo.c -lbar -L.
$ ln -s libfoo.so.1.0.0  libfoo.so
$ gcc -c main.c
$ ld -rpath /home/jack/Desktop/test -e main -o main main.o -L. -lfoo -lbar

然后我运行名为main的可执行文件。

$./main

但shell返回以下字符串

  

bash:./main:没有这样的文件或目录。

但主文件确实存在于当前目录中。

为什么?

2 个答案:

答案 0 :(得分:5)

通常,您不应直接调用ld。相反,您应该使用gcc来进行链接。 gcc将一些特殊选项传递给链接器。

如果我修改您的脚本以使用正确的sonames并使用gcc进行链接,则可以正常工作。我这样做了:

gcc -fPIC -shared -Wl,-soname,libbar.so.1.0.0 -o libbar.so.1.0.0 bar.c
ln -s libbar.so.1.0.0 libbar.so
gcc -fPIC -shared -Wl,-soname,libfoo.so.1.0.0 -o libfoo.so.1.0.0 foo.c -lbar -L.
ln -s libfoo.so.1.0.0  libfoo.so
gcc -c main.c
gcc -Wl,-rpath,$(pwd) -o main main.o -L$(pwd) -lfoo -lbar

直接使用ld是出于异常情况。不要这样做。那就是说,我不知道你的方法有什么问题。我认为-e在这里是错误的 - 你不想直接调用main,_start做其他事情。查看ldd的输出显示了两种方法之间的一些重要差异。使用gcc -v调用链接会向您展示幕后发生的事情,以防您想了解更多内容。

答案 1 :(得分:2)

 val vertexRDD: org.apache.spark.rdd.RDD[(VertexId, Array[Int])]
 val clusters  = vertexRDD.takeSample(false, 3)
 val clustersRDD: RDD[(VertexId, Array[Int])] = sc.parallelize(clusters)
 val final = vertexRDD.subtract(clustersRDD)
 final.collect().foreach(println(_))
     

但主文件确实存在于当前目录中。

     

为什么?

可执行文件需要合适的程序解释器才能执行动态链接。打印bash: ./main: no such file or directory. 消息是因为无法找到错误的默认解释器。

使用no such file or directory选项ld(对于32位)进行设置。

64位动态链接器为-dynamic-linker /lib/ld-linux.so.2

由于您的输入是直接/lib64/ld-linux-x86-64.so.2,因此您必须在main结束时致电exit(0)。它不能从main返回,因为没有人调用它。指令指针由内核直接设置为main的地址。从main返回可能会导致段错误,因为您没有向printf添加main,所以无法看到消息。