Articles of 精灵

查找生成的核心转储的可执行文件

有没有一种方法可以将版本信息(如git commit hash)embedded到ELF可执行文件中,从而可以从其生成的核心转储中检索它?

链接器如何确定.rodata节中某些数据的地址?

所以testing平台在Linux 32位上。 我用这个方法使用gcc生成一个quickSort的obj文件: gcc -S quickSort.c 生成的quickSort.o是一个可重定位的ELF: #file quickSort.o quickSort.o:ELF 32位LSB可重新定位,英特尔80386,版本1(SYSV),未剥离 然后我使用objdump来拆卸它: objdump -d quickSort.o 并查看生成的asm文件,我对此感到困惑: 51: b8 00 00 00 00 mov $0x0,%eax 56: 89 04 24 mov %eax,(%esp) 59: e8 fc ff ff ff call 5a <main+0x5a> 5e: c7 44 24 3c 00 00 00 movl $0x0,0x3c(%esp) 上面的代码是调用printf函数并打印出一个string,如果我编译quicksort.c到quicksort.s,它应该是这样的: movl $.LC0, %eax movl %eax, […]

为什么.bss部分映射到比目标文件中报告的bss小的进程?

我总是假定链接器分配了任何库的bss部分并将其映射到进程中。 这部分的大小将取决于图书馆报告的bss的大小。 我查看了进程的/ proc / [PID] / maps文件,并计算了加载库的bss部分的大小。 7f1f5561f000-7f1f55637000 r-xp 00000000 08:01 3018048 /usr/lib/libpthread-2.19.so 7f1f55637000-7f1f55837000 —p 00018000 08:01 3018048 /usr/lib/libpthread-2.19.so 7f1f55837000-7f1f55838000 r–p 00018000 08:01 3018048 /usr/lib/libpthread-2.19.so 7f1f55838000-7f1f55839000 rw-p 00019000 08:01 3018048 /usr/lib/libpthread-2.19.so 7f1f55839000-7f1f5583d000 rw-p 00000000 00:00 0 7f1f5583d000-7f1f55851000 r-xp 00000000 08:01 3017945 /usr/lib/libresolv-2.19.so 7f1f55851000-7f1f55a50000 —p 00014000 08:01 3017945 /usr/lib/libresolv-2.19.so 7f1f55a50000-7f1f55a51000 r–p 00013000 08:01 3017945 /usr/lib/libresolv-2.19.so […]

Linux在运行时迭代ELF“节”标题

简短版本:在运行时可以遍历所有的ELF“section”头文件,并为每个加载的共享库获取每个“section”头文件的重定位地址。 长版本:我试图在内核(dyn_debug)中实现用户空间中的dynamicdebugging相同的机制。 它的工作方式是每个LOGmacros实例在程序中的特定“section”中创build静态variables__attribute__((section("__verbose")))这强制编译器将variables放在“.data”部分,而不是放在“__verbose”部分。 稍后可以通过variables__start___verbose,__stop___verbose来访问本节的启动和停止地址。 通过这种方式,一些中央例行程序可以遍历所有注册的“日志”条目并按需改变属性。 这适用于静态链接的可执行文件,但是当使用共享库时,有几个“__verbose”部分(每个共享库一个),另一个在可执行文件本身。 (我使用-fPIC标志当然是为了包含在库中)为了确保所有的符号都被导出,所有与“-export-dynamic”链接的东西都一样。 每个共享库和主可执行文件都有init的属性 (构造函数)方法。 我观察到两种不同的行为。 case1:对于第一种情况,库不是用ldopen加载,而是用“libc loader” 引用__start___verbose总是返回与主可执行文件相同的地址(主可执行文件),其中只有“主要”可执行日志条目存在。 dlsym(RTLD_NEXT,__start___verbose)返回“下一个”可parsing库的符号地址,所以实际上我得到所有的地址。 情况2:使用ldopen加载库 引用__start___verbose总是返回相同的地址(主可执行文件的地址) dlsym(RTLD_NEXT,__start___verbose)返回NULL。 dlsym(RTLD_DEFAULT,__start___verbose)返回“main”进程表。 dlsym(句柄,__start___verbose) – 返回正确的段地址 问题:有没有办法使用ldopen打开库来获取该符号,除了4之外,因为4需要显式调用“loader” 码: /* Main" */ void func1() { static int attribute__((section("__verbose"))) var = 1; } /* Shared library */ void func2() { static int attribute__((section("__verbose"))) var = 2; } /* Both in main and […]

dlsym:未定义的符号,Android N

我想从我的应用程序中的Android运行时共享库​​中读取值。 从Android 5开始,当新的运行时被引入并且libart.so第一次出现的时候,我用这个代码成功地完成了它: std::unique_ptr<void, int(*)(void*)> handle { dlopen("libart.so", RTLD_NOW | RTLD_GLOBAL), &dlclose }; constexpr char THREAD_KEY_NAME[] = "_ZN3art6Thread17pthread_key_self_E"; key_ = static_cast<pthread_key_t *>(dlsym(handle.get(), THREAD_KEY_NAME)); LOG("Current thread: ", key_); 我在Android N模拟器上testing这个代码,并且失败! dlsym返回: undefined symbol: _ZN3art6Thread17pthread_key_self_E 我想“好吧,现在没有符号了”,所以我从模拟器中拉出libart.so,看看: % ./i686-linux-android-nm ~/Desktop/libart.so | grep pthread_key 00736ea0 B _ZN3art6Thread17pthread_key_self_E 嗯… % ./i686-linux-android-objdump -T ~/Desktop/libart.so | grep pthread_key 00736ea0 g DO .bss […]

从不同的共享库中的相同符号总是从符号名称空间的根开始查找?

从我收集的信息中可以看出,共享库的默认可见性符号的符号名称查找以呼吸优先的顺序遍历共享库依赖关系树,可执行程序是此search树的根。 所有由一个DT_NEEDED列表链接的库都在这个树的同一层。 因此,当查找符号“foo”时,在我看来,它的查找总是在运行时被绑定到相同的库或可执行文件。 dynamic链接器是否利用这个function,并且有一个“全局符号表”(可能与链接映射表有关),它知道什么符号属于什么共享库,一旦符号第一次被查找,并把地址符号被另一个共享库第二次查找的时候,那个库中的符号出现了吗? 或者将这个符号永远抬头,好像这是第一次查找?

将.so文件转换为.jnilib文件

我有一个.so库,在ELF格式下编译用于Linux,正在被Java程序使用。 我试图将这个应用程序移植到Mac OS X,并发现OS X为这些文件使用不同的扩展名.jnilib 。 我已经想出了如何设置PATH以便正确find文件。 但是,OS X Java无法加载.so文件(因为它期望其他扩展名)。 如果将文件扩展名从.so更改为.jnilib ,则JVM可以find这些文件,但无法读取它们(因为它们编译不正确)。 有没有办法,无论是在Linux系统或在Mac OS X, 没有源代码 ,将这些.so文件转换为.jnilib ? 我怀疑这是不可能的,但堆栈溢出还没有让我失望 – 我不会把“这是不可能的”作为失败。

文本重定位在共享对象?

当我编译下面的代码(文件命名为dc)使用gcc int var=10; void fun( void ) { var++; int a=var; } 同 gcc -c -o do -fPIC dc 并调用readelf -S。.text部分有一个名为.rela.text的重放部分 如果我把文件链接到共享对象(reloctest.so) gcc -shared do -o reloctest.so 搬迁部分消失 是否保证共享对象中的.text段没有重定位? 我想是的(由于搬迁是PLT和DYN添加),但我不知道 感谢您的任何答案

目前的Linux仍然支持a.out可执行格式吗?

我已经在很多地方看过Linux现在已经转向使用ELF了。 但是,它们都没有指定a.out格式的可执行文件是否仍然可以在Linux中运行。

为了获得ELF二进制文件的大小,size和ls有什么区别?

testing是在32位x86 Linux上进行的。 为了获得一些ELF二进制文件的大小,我尝试了这两个命令: ls -la sha512sum size sha512sum 但是,尺寸输出是不同的: ls -la sha512sum -rwxrwxr-x 1 szw175 szw175 95856 Oct 10 07:50 sha512sum size sha512sum text data bss dec hex filename 89644 488 452 90584 161d8 sha512sum 所以我的问题是,为了评估ELF二进制文件的大小,哪种方法更可靠? 为什么这两种方法不同?