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

问题描述 投票:0回答:3

我有一些简单的代码文件

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

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

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

(假设函数体可能更短或更长,而且 源 fite 中可能添加了其他功能或数据 它会成块移动,但我怀疑对其进行本地化的程序 应该不是很复杂。

c gcc linker
3个回答
2
投票

您可以使用

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


1
投票

您可以在函数的开头和结尾定义类似

int abc = 0x11223344;
的内容,并使用常量来定位函数体。


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/

© www.soinside.com 2019 - 2024. All rights reserved.