大佬教程收集整理的这篇文章主要介绍了如何编译ELF二进制文件以便它可以作为动态库加载?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
void main() { int i = @L_696_7@; printf("Returned: %d",i);//Prints "Returned: 5" } int @L_696_7@ { return 5; }@H_673_3@外部计划:
// ... Somehow load executable from above void main() { int i = @L_696_7@; printf("Returned: %d",i);//Must print "Returned: 5" }
// Hello.c #include <String.h> #include <stdio.h> void Hello() { printf("Hello world\n"); } int main() { Hello(); return 0; }@H_673_3@调用者可执行文件:
// caller.c #include <dlfcn.h> #include <stdio.h> int main(int argc,char** argv) { void* handle = dlopen(argv[1],RTLD_LAZY); if (!handlE) { fprintf(stderr,"%s\n",dlerror()); return 1; } void (*Hello)() = dlsym(handle,"Hello"); if (!Hello) { fprintf(stderr,dlerror()); return 1; } Hello(); return 0; }@H_673_3@试图让它工作:
$gcc -fpie -pie Hello.c -o Hello $gcc caller.c -o caller $./caller ./Hello ./Hello: undefined symbol: Hello@H_673_3@原因是当您将Hello编译为PIE时,动态链接器不会将地狱符号添加到动态符号表(.dynsym):
$readelf -s Symbol table '.dynsym' contains 12 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000200 0 SECTION LOCAL DEFAULT 1 2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab 3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2) 4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2) 5: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 6: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses 7: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable 8: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.2.5 (2) 9: 0000000000200bd0 0 NOTYPE GLOBAL DEFAULT 24 _edata 10: 0000000000200bd8 0 NOTYPE GLOBAL DEFAULT 25 _end 11: 0000000000200bd0 0 NOTYPE GLOBAL DEFAULT 25 __bss_start Symbol table '.symtab' contains 67 entries: Num: Value Size Type Bind Vis Ndx Name [...] 52: 0000000000000760 18 FUNC GLOBAL DEFAULT 13 Hello [...]@H_673_3@为了解决这个问题,你需要将-E标志传递给ld(参见@AlexKey的anwser):
$gcc -fpie -pie Hello.c -Wl,-E Hello.c -o Hello $gcc caller.c -o caller $./caller ./Hello Hello world $./Hello Hello world $readelf -s ./Hello Symbol table '.dynsym' contains 22 entries: Num: Value Size Type Bind Vis Ndx Name [...] 21: 00000000000008d0 18 FUNC GLOBAL DEFAULT 13 Hello [...]@H_673_3@一些参考 @H_673_3@欲了解更多信息,来自计划图书馆的4. Dynamically Loaded (DL) Libraries HOWTO是一个开始阅读的好地方.
以上是大佬教程为你收集整理的如何编译ELF二进制文件以便它可以作为动态库加载?全部内容,希望文章能够帮你解决如何编译ELF二进制文件以便它可以作为动态库加载?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。