在.o文件中本地化函数体块

时间:2014-11-19 08:38:03

标签: 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

它是mangen.o文件,它是400字节

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  ................ 

现在我需要知道包含二进制块的位置 在这里的函数体上面

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

(假设功能体可能更短或更长) 添加源fite中可能还有其他功能或数据 它将移动大块但我怀疑程序本地化它 应该不是很复杂。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以使用objdump或nm。

例如,尝试:

 nm mangen.o

或者

 objdump -t mangen.o

如果您需要使用自己的代码,请查看此处:

http://www.rohitab.com/discuss/topic/38591-c-import-table-parser/

它会给你一些东西。您可以在MSDN中找到有关格式的更多信息。

如果您使用的是Python,那么可以使用很好的工具/库(包括源代码):

https://code.google.com/p/pefile/

答案 2 :(得分:1)

您可以在函数的开头和结尾定义类似int abc = 0x11223344;的内容,并使用常量来定位函数体。