Tag: objdump

为什么gcc输出机器代码有nop指令

每次我做一个objdump -d我总是看到asm代码与批量的nop指令(指令什么都不做) 例如,采取相同的程序: #include #include int main() { printf(“Hello World!\n”); printf(“cos: %f\n”, cos(1)); return 1; } 示例的objdump在入口点的末尾有2个nops 0000000000400450 : 400450: 31 ed xor %ebp,%ebp 400452: 49 89 d1 mov %rdx,%r9 400455: 5e pop %rsi 400456: 48 89 e2 mov %rsp,%rdx 400459: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp 40045d: 50 push %rax 40045e: 54 push %rsp […]

如何列出链接器分配的代码对象w / gcc?

我正在构建一个由几个代码模块和一个静态库组成的嵌入式应用程序。 一些全局变量显式放在专用内存部分(即,不是默认的.data部分)。 处理器内存架构是4个库,创建了连续的物理内存空间。 在我的应用程序中,只有第一个库被保留用于代码,而其他3个库被保留用于显式分配的全局和一个小堆栈。 问题是代码部分(.text)现在超出了第一个库边界,我得到以下链接器错误消息: ./bin/ld: section .data_bank1 loaded at [0000000000002000,0000000000003fff] overlaps section .text loaded at [0000000000000630,00000000000020df] ./bin/ld: section .fini loaded at [00000000000020e0,00000000000020f9] overlaps section .data_bank1 loaded at [0000000000002000,0000000000003fff] 有没有办法在链接器检查节和对象重叠之前查看对象分配(可能在临时对象文件中),并中止构建?

在objdump的输出中,2 ** 2和2 ** 0的“Algn”是什么意思?

这在下面的文件中意味着什么? 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 […]

无法在二进制文件中找到.dtors和.ctors

我正在读“黑客”这本书。 在书中有一节解释了.dtors和.ctors 。 我正在尝试重现本书的一个练习,但在我的可执行文件中,我没有这一部分。 起初我认为问题是我正在编译64位,但现在我正在编译32位和.dtors和.ctors仍未出现在节表中。 这是代码: #include #include static void miConstructor(void) __attribute__ ((constructor)); static void miDestructor(void) __attribute__ ((destructor)); int main(void) { printf(“En main() \n”); return 0; } void miConstructor(void) { printf(“En el constructor\n”); } void miDestructor(void) { printf(“En el destructor\n”); } 我正在编译: gcc -m32 -o a.out dtors_example.c 这是nm的输出: 080495f0 d _DYNAMIC 080496e4 d _GLOBAL_OFFSET_TABLE_ 080484dc […]

C程序中.bss段的模糊行为

我在下面编写了简单的C程序(test.c): – #include int main() { return 0; } 并执行以下内容以了解.bss段中的大小更改。 gcc test.c -o test size test 输出结果如下: – text data bss dec hex filename 1115 552 8 1675 68b test 我没有声明全局或静态范围。 所以请解释为什么bss段大小为8个字节。 我做了以下改变: – #include int x; //declared global variable int main() { return 0; } 但令我惊讶的是,输出与以前相同: – text data bss dec hex filename 1115 […]

我可以给objdump一个地址并让它反汇编包含的函数吗?

我发现为了获得足够的上下文以查看导致崩溃的原因,必须反汇编大量的库代码真的很烦人。 有什么方法可以直接objdump一个地址,让它为我找到包含函数的边界? 编辑:更好的是,我可以让它拆卸整个堆栈跟踪吗?

为什么objdump不显示.bss,.shstratab,.symtab和.strtab部分?

我目前正在C中执行自己的objdump实现。 对于我的-s选项,我必须显示ELF文件部分的全部内容。 我做得很好,但我显示的部分比“真正的”objdump更多。 实际上,它不会输出.bss,.shstrtab,.symtab和.strtab部分。 我正在寻找Shdr结构上的sh_flags值,但我找不到任何逻辑…… 为什么objdump -s没有显示这些部分?

缓冲区溢出攻击

我正在尝试执行一个非常简单的缓冲区溢出攻击。 我几乎是新手。 所以,如果这个问题很愚蠢,请原谅:-) 代码: #include #include int i, n; void confused(int i) { printf(“**Who called me? Why am I here?? *** %x\n “, i); } void shell_call(char *c) { printf(” ***Now calling \”%s\” shell command *** \n”, c); system(c); } void victim_func() { int a[4]; printf(“Enter n: “); scanf(“%d”,&n); printf(“~~~~~~~~~~~~~ values and address of n […]

分析ELF部分和符号大小的工具

我需要一种方法来分析我的GCC编译器的输出文件。 我正在编制裸机,我非常关心尺寸。 我可以使用交叉编译器提供的arm-none-eabi-objdump ,但如果存在用于此任务的工具,则解析输出不是我想要做的事情。 你知道这样的工具存在吗? 我的搜索没有结果。 还有一件事,我自己的代码中的每个函数都在它自己的部分。