c - C:对内联函数的未定义引用
问题描述
由于我的上一个问题由于错误的代码样式和拼写错误而被关闭,因此我对其进行了审查并再次寻求帮助。
我正在尝试使用 PE 格式解析 .exe 文件。这是我的代码的一部分
#include "PE_resolve.h"
#define SIZEOF_SECTION_HEADER 0x28
/*load filebuffer into Imagebuffer*/
int Read_2_ImageBuffer(void **p_filebuffer, void **p_Imagebuffer,long filesize);
/*helper function*/
inline void * Get_NT_POS(void **p_filebuffer);
inline void * Get_FileHeader_POS(void **p_filebuffer);
inline void * Get_Opt_FileHeader_POS(void **p_filebuffer);
int main(){
return 0;
}
int Read_2_ImageBuffer(void **p_filebuffer, void **p_Imagebuffer,long filesize){
/*allocate memory for imagebuffer*/
void *Opt_PE_Header = Get_Opt_FileHeader_POS(p_filebuffer); //THE ERROR LINE
DWORD SizeOfImage = *(DWORD*) ((BYTE *)Opt_PE_Header + 0x38);
*p_Imagebuffer = malloc(SizeOfImage);
if(*p_Imagebuffer == NULL){
printf("can't allocate enough heap memory\n");
exit(EXIT_FAILURE);
}
memset(*p_Imagebuffer,0,SizeOfImage);
/*.....something deal the memory.....*/
return 0;
}
inline void * Get_NT_POS(void **p_filebuffer){
/*return void * point to NT_header in filebuffer*/
DWORD offset = *(DWORD*)((BYTE *)*p_filebuffer + 0x3c);
return (BYTE *)*p_filebuffer + offset;
}
inline void * Get_FileHeader_POS(void **p_filebuffer){
/*return void * point to PE_header in filebuffer*/
void *nt_pos = Get_NT_POS(p_filebuffer);
return (BYTE *)nt_pos + sizeof(DWORD);
}
inline void * Get_Opt_FileHeader_POS(void **p_filebuffer){
/*return void * point to option_PE_header in filebuffer*/
void *fileheader_pos = Get_FileHeader_POS(p_filebuffer);
return (BYTE *)fileheader_pos + 0x14;
}
这是 PE_resolve.h
#ifndef __PE_resolve_header
#define __PE_resolve_header
#define IMAGE_SIZEOF_SHORT_NAME 8
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char BYTE;
typedef short WORD;
typedef int DWORD;
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} _IMAGE_SECTION_HEADER;
#endif
当我用 MinGW 编译它时,它带有对“Get_Opt_FileHeader_POS”的未定义引用
C:\MinGW\bin\gcc.exe -g D:\Compile\PE_resolve\PE_loader.c -o D:\Compile\PE_resolve\PE_loader.exe
c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\15205\AppData\Local\Temp\ccadB6tt.o: in function `Read_2_ImageBuffer':
D:/Compile/PE_resolve/PE_loader.c:52: undefined reference to `Get_Opt_FileHeader_POS'
如您所见,我在这个 .c 文件中实现了所有功能,并以原型开头。我有点沮丧。你能告诉我导致错误的原因吗?谢谢 :(
解决方案
您可以static
在每个内联函数之前添加关键字。
通过这样做,您可以强制链接器在符号表中包含函数符号:
static inline void *Get_Opt_FileHeader_POS(void **p_filebuffer);
另一种选择是简单地删除 inline 关键字。
推荐阅读
- ios - 如何将集合视图和页面视图放在一个场景中
- c++ - 实时获取 QProcess 的响应
- android - Xamarin firebase 不同的 google-services.json 用于不同的构建配置
- javascript - 带有 slice() 的函数中的 JS 参数返回未定义
- ios - 如何将 CXCallController 放在最前面
- angular - OAuth协商后将应用程序令牌从spring boot后端传递到角度前端的最佳方法
- javascript - 关于声明 var 的说明
- angular - Angular 6/7 多应用更改项目目录(ng g application module1)
- c# - 向接口添加新方法或强制转换对象?
- doctrine - 如何在 TYPO3 8.x extbase 中获取禁用的实体?