将ELF二进制文件与c程序链接

将ELF二进制文件与c程序链接,c,gcc,linker,ld,elf,C,Gcc,Linker,Ld,Elf,如果只允许访问独立的ELF程序,我希望能够从自己的程序中调用程序中的函数。 假设下面的代码是main.c #include <stdio.h> extern int mystery(int a,int b); int main() { int a = 0; int b = 1; printf("mystery(a,b) = %d\n",mystery(a,b)); return 0; } 但是,这给了我一个未定义的

如果只允许访问独立的ELF程序,我希望能够从自己的程序中调用程序中的函数。 假设下面的代码是
main.c

#include <stdio.h>

extern int mystery(int a,int b);

int main() {
        int a = 0;
        int b = 1;
        printf("mystery(a,b) = %d\n",mystery(a,b));
        return 0;
}
但是,这给了我一个未定义的对
谜团的引用错误
。我一直在寻找方法 在论坛上发现无法将此elf文件转换为共享对象文件。我还研究了如何使用

gcc -c main.c
然后使用
ld
将elf链接到
main.o
,但我不知道该怎么做。elf是32位的,但我省略了
-m32
标志。如果
ld
的标志不同,请告诉我。任何帮助都将不胜感激

编辑:
readelf-h非我的程序的输出

ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0x10e0
  Start of program headers:          52 (bytes into file)
  Start of section headers:          15116 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         11
  Size of section headers:           40 (bytes)
  Number of section headers:         30
  Section header string table index: 29
如果只允许访问独立的ELF程序,我希望能够从自己的程序调用程序中的函数

听起来你好像有一个朋友

虽然您的愿望在技术上是可能的,但实现这一点的难度大约是您迄今为止尝试的1000倍。如果你不准备花一两个月的时间来解决这个问题,你应该寻找其他的解决方案

实际上,您必须编写一个自定义ELF加载器,将
not_my_program
加载到内存中并对其进行初始化,然后调用
summary
而不是
main

还要注意的是,
summary
可能依赖于全局数据,并且数据可能在
main
中初始化,因此不能保证在
main
之前调用
summary
时会工作


另外,从调试器调用
神秘
是否足够?这可以在30秒钟内完成。

这种老套的方法适用于一个非常简单的案例

[ aquila ~ ] $ cat 1.c
int func (int a) { return a * (a-1) ; }
int main(int argc) { return func (argc) ; }
[ aquila ~ ] $ cc 1.c
[ aquila ~ ] $ ./a.out ; echo $?
0
[ aquila ~ ] $ readelf -s a.out | grep func
    43: 0000000000400487    19 FUNC    GLOBAL DEFAULT   11 func
[ aquila ~ ] $ cat 2.c
#include <stdlib.h>
static __attribute__((constructor)) void main() {
  int (*func)() = (int (*)())0x0000000000400487;
  exit(func(3));
}
[ aquila ~ ] $ cc -fPIC -shared 2.c -o a.so
[ aquila ~ ] $ LD_PRELOAD=./a.so ./a.out ; echo $?
6
[aquila~]$cat 1.c
int func(int a){返回a*(a-1);}
int main(int argc){return func(argc);}
[aquila~]$cc 1.c
[阿奎拉~]$/年;回声$?
0
[aquila~]$readelf-s a.out | grep func
43:0000000000 400487 19 FUNC全局默认值11 FUNC
[aquila~]$cat 2.c
#包括
静态uuu属性uuu((构造函数))void main(){
int(*func)(=(int(*)()0x000000000040487;
退出(职能(3));
}
[aquila~]$cc-fPIC-shared 2.c-o a.so
[aquila~]$LD_PRELOAD=./a.so./a.out;回声$?
6.

c中的调用者被构造成一个带出口的构造函数,这样就不会调用主程序的
main()
,试图限制调用者和
func()
本身以外的代码的执行。返回值为6而不是0表示调用已工作,并且主程序的
main()
没有被调用。

如何生成
不是我的程序
的?gcc不是我的程序main.c工作吗?每个elf文件的
readelf-h
输出是什么?@Eraklon我在problem@KamilCuk
不是我的程序
我相信最初是一个c程序。但是,我没有访问源代码的权限。尝试使用
gcc main.c not_my_program-m32
gcc-c main.c-o main.o-m32
gcc main.o not_my_program-o my_program
进行编译……甚至可能在这里添加
-m32
。只是猜测而已。先生,你有可怕的知识和解决问题的能力。非常感谢,这将完成工作。
[ aquila ~ ] $ cat 1.c
int func (int a) { return a * (a-1) ; }
int main(int argc) { return func (argc) ; }
[ aquila ~ ] $ cc 1.c
[ aquila ~ ] $ ./a.out ; echo $?
0
[ aquila ~ ] $ readelf -s a.out | grep func
    43: 0000000000400487    19 FUNC    GLOBAL DEFAULT   11 func
[ aquila ~ ] $ cat 2.c
#include <stdlib.h>
static __attribute__((constructor)) void main() {
  int (*func)() = (int (*)())0x0000000000400487;
  exit(func(3));
}
[ aquila ~ ] $ cc -fPIC -shared 2.c -o a.so
[ aquila ~ ] $ LD_PRELOAD=./a.so ./a.out ; echo $?
6