有一个可执行文件动态链接到多个共享对象.如何确定某些符号(导入可执行文件)属于哪一个?
如果有多种可能性,我可以将ld模拟并看到它被拍摄的位置吗?
我们知道.bss包含未初始化的变量.如果在c代码中,程序员在使用它们之前初始化变量.然后.bss在执行C代码之前不必为零.
我对吗?
谢谢
字节码二进制可执行文件(如Java类文件,Parrot字节码文件或CLR文件)和机器代码可执行文件(如ELF,Mach-O和PE)之间有何区别.
这两者之间有什么明显的区别?
比如ELF结构中的.text区域等于类文件的哪个部分?
或者它们都有标题,但ELF和PE标题包含Architecture,但Class文件不包含
Java类文件

精灵档案

PE文件

我一直在搜索很多,但还没有找到一种方法来提取函数原型,至少从ELF可执行文件中获取参数类型和返回类型.使用GNU BinUtils或任何其他方法.
我尝试在readelf,nm和objdump中使用不同的选项,它们列出了符号和函数名称,但是如何知道函数的参数类型和返回类型?
我有一种直觉,应该有办法做到这一点,任何人都能对此有所了解吗?
主持人:Windows 7
目标:用于PowerPC架构的elf
是否有一个在Linux上运行的反汇编程序,它能够将x86 ELF可执行文件分解为Intel语法中的汇编代码(即操作目标寄存器,源寄存器等)?优选地,输出反汇编器将非常接近NASM语法.objdump -d工作得相当好,但输出AT&T语法,我有时会发现很难遵循,ndiasm只能根据我的知识拆分直接二进制.
这在下面的文件中意味着什么?2**2和2**0
$ objdump -h main.o
main.o: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000000b 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 00000000 00000000 00000040 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000040 2**2
ALLOC
3 .note.GNU-stack 00000000 00000000 00000000 00000040 2**0
CONTENTS, READONLY, CODE
Run Code Online (Sandbox Code Playgroud) static inline Elf32_Shdr *elf_sheader(Elf32_Ehdr *hdr) {
return (Elf32_Shdr *)((int)hdr + hdr->e_shoff);
}
static inline Elf32_Shdr *elf_section(Elf32_Ehdr *hdr, int idx) {
return &elf_sheader(hdr)[idx];
}
Run Code Online (Sandbox Code Playgroud)
好的,这里的第一个函数通过使用返回指向elf节头的指针,hdr_shoff因为这是第一节头的偏移量.现在,第二个函数用于通过使用数组索引来访问更多节标题(如果有的话).
static inline char *elf_str_table(Elf32_Ehdr *hdr) {
if(hdr->e_shstrndx == SHN_UNDEF) return NULL;
return (char *)hdr + elf_section(hdr, hdr->e_shstrndx)->sh_offset;
}
static inline char *elf_lookup_string(Elf32_Ehdr *hdr, int offset) {
char *strtab = elf_str_table(hdr);
if(strtab == NULL) return NULL;
return strtab + offset;
}
Run Code Online (Sandbox Code Playgroud)
我遇到上述两个用于访问节名称的函数的问题.e->shstrndx是字符串表的索引.所以在elf_str_table我们首先检查它SHN_UNDEF.但是return我不明白那hdr->e_shstrndx是字符串表的索引,如何将该索引添加到elf_section标头的起始地址,给出另一个elf节标题(因为我们正在使用它访问sh_offset).我的困惑是它e->shstrndx …
我在ELF二进制文件中看到了这个有用的功能 - Build ID."它......(通常)是ELF图像中所有代码部分的SHA1哈希值." 可以用GNU实用程序读取它:
$ readelf -n /bin/bash
...
Displaying notes found at file offset 0x00000274 with length 0x00000024:
Owner Data size Description
GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring)
Build ID: 54967822da027467f21e65a1eac7576dec7dd821
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种简单的方法可以自己重新计算Build ID?检查它是否没有损坏等
我正在尝试一个简单的汇编代码:
.section .data
output:
.ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n"
.section .bss
.lcomm buffer, 12
.section .text
.code32
.globl _start
_start:
movl $0, %eax
cpuid
movl $output, %edi
Run Code Online (Sandbox Code Playgroud)
在.bss部分我定义了一个名为"buffer"的变量
当我尝试在gdb中获取其地址/值时,它只是打印:
(gdb) p $buffer $1 = void
使用objdump,我发现该名称不在ELF文件中,那么如何在运行as和ld时保留这些名称信息?谢谢!
我知道-fPIC共享库是必需的,并且知道为什么。
但是,我不清楚这个问题:
不应-fPIC在构建可执行文件或静态库时使用它?
elf ×10
c ×4
gcc ×3
linux ×3
.class-file ×1
assembly ×1
bytecode ×1
c++ ×1
compilation ×1
disassembly ×1
executable ×1
extraction ×1
gdb ×1
ld ×1
linker ×1
machine-code ×1
objdump ×1
powerpc ×1
solaris ×1
x86 ×1