c++ - 在 .o 文件中本地化函数体 block

标签 c++ c gcc compiler-construction linker

我得到了一些简单的代码文件

mangen.c:

///////////// begin of the file 
void mangen(int* data) 
{ 
  for(int j=0; j<100; j++) 
   for(int i=0; i<100; i++) 
      data[j*100+i] = 111; 
} 
//////// end of the file 

我用 mingw 编译它(在 win32 上)

c:\mingw\bin\gcc -std=c99 -c mangen.c -fno-exceptions -march=core2 -mtune=generic -mfpmath=both -msse2

生成 400 字节的 mangen.o 文件

00000000  4C 01 03 00 00 00 00 00-D8 00 00 00 0A 00 00 00  L............... 
00000010  00 00 05 01 2E 74 65 78-74 00 00 00 00 00 00 00  .....text....... 
00000020  00 00 00 00 4C 00 00 00-8C 00 00 00 00 00 00 00  ....L........... 
00000030  00 00 00 00 00 00 00 00-20 00 30 60 2E 64 61 74  ........ .0`.dat 
00000040  61 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  a............... 
00000050  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................ 
00000060  40 00 30 C0 2E 62 73 73-00 00 00 00 00 00 00 00  @.0..bss........ 
00000070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................ 
00000080  00 00 00 00 00 00 00 00-80 00 30 C0 55 89 E5 83  ..........0.U... 
00000090  EC 10 C7 45 FC 00 00 00-00 EB 34 C7 45 F8 00 00  ...E......4.E... 
000000A0  00 00 EB 21 8B 45 FC 6B-D0 64 8B 45 F8 01 D0 8D  ...!.E.k.d.E.... 
000000B0  14 85 00 00 00 00 8B 45-08 01 D0 C7 00 6F 00 00  .......E.....o.. 
000000C0  00 83 45 F8 01 83 7D F8-63 7E D9 83 45 FC 01 83  ..E...}.c~..E... 
000000D0  7D FC 63 7E C6 C9 C3 90-2E 66 69 6C 65 00 00 00  }.c~.....file... 
000000E0  00 00 00 00 FE FF 00 00-67 01 6D 61 6E 67 65 6E  ........g.mangen 
000000F0  2E 63 00 00 00 00 00 00-00 00 00 00 5F 6D 61 6E  .c.........._man 
00000100  67 65 6E 00 00 00 00 00-01 00 20 00 02 01 00 00  gen....... ..... 
00000110  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................ 
00000120  2E 74 65 78 74 00 00 00-00 00 00 00 01 00 00 00  .text........... 
00000130  03 01 4B 00 00 00 00 00-00 00 00 00 00 00 00 00  ..K............. 
00000140  00 00 00 00 2E 64 61 74-61 00 00 00 00 00 00 00  .....data....... 
00000150  02 00 00 00 03 01 00 00-00 00 00 00 00 00 00 00  ................ 
00000160  00 00 00 00 00 00 00 00-2E 62 73 73 00 00 00 00  .........bss.... 
00000170  00 00 00 00 03 00 00 00-03 01 00 00 00 00 00 00  ................ 
00000180  00 00 00 00 00 00 00 00-00 00 00 00 04 00 00 00  ................ 

现在我需要知道二进制 block 在哪里 上面的函数体在这里

有人可以提供一些简单的代码让我检索 这个界限?

(假设函数体可能更短或更长,并且 源文件中可能添加了其他功能或数据,因此 它会成 block 移动,但我怀疑它的本地化程序 应该不是很复杂。

最佳答案

您可以使用 objdump -Fd mangen.o 找出函数的文件偏移量和长度。
或者,您可以使用 readelf -s mangen.o 找出函数的大小。

关于c++ - 在 .o 文件中本地化函数体 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27012252/

相关文章:

c++ - 找不到入口点

将对象添加到 vector 时出现 C++ 错误

c++ - 从 vector 和 unordered_map 中获取三个最常出现的单词及其计数值

c - 基于 C 中用户输入的动态增长数组

c - fscanf 在行中间找到空白字段后无法正常工作

gcc - 使用 gcc 时跳过 scanf() (和 cin)语句

c++ - 为什么 GCC 在我的机器上创建额外的汇编指令?

c++ - 我需要在C++中的两个字符串之间找到通用前缀

c - (r+1 + (r >> 8)) >> 8 是做什么的?

c++ - C++11 <codecvt> header 在最新的 GCC 中可用吗?