这没什么大不了的,仅是为了我的实验,但永远不会让我烦恼我无法编译此代码:
#include <stdio.h>
#define MARK_ENCRYPTED_FUNCTION_START(NAME) \
__asm__ __volatile__ (#NAME "_enc_start:")
#define MARK_ENCRYPTED_FUNCTION_END(NAME) \
__asm__ __volatile__ (#NAME "_enc_end:")
#define GET_ENCRYPTED_FUNCTION_ADDRESS_AND_LENGHT(NAME, ADDR, LENGHT) \
__asm__ __volatile__ (\
"movl $" #NAME "_enc_start, %0\n\t"\
"movl $" #NAME "_enc_end, %1\n\t"\
: "=r"(ADDR), "=r"(LENGHT)\
)
int f()
{
MARK_ENCRYPTED_FUNCTION_START(f);
{
int sum = 0;
int i = 0;
for (i = 0; i < 11; ++i)
{
sum += i;
}
return sum;
}
MARK_ENCRYPTED_FUNCTION_END(f);
}
int main()
{
unsigned int f_addr, f_len;
GET_ENCRYPTED_FUNCTION_ADDRESS_AND_LENGHT(f, f_addr, f_len);
printf("f - addr start: %x; addr end: %d\n", f_addr, f_len);
return 0;
}
gcc -E test.c
的输出是这样的:int f()
{
__asm__ __volatile__ ("f" "_enc_start:");
{
int sum = 0;
int i = 0;
for (i = 0; i < 11; ++i)
{
sum += i;
}
return sum;
}
__asm__ __volatile__ ("f" "_enc_end:");
}
int main()
{
unsigned int f_addr, f_len;
__asm__ __volatile__ ( "movl $" "f" "_enc_start, %0\n\t" "movl $" "f" "_enc_end, %1\n\t" : "=r"(f_addr), "=r"(f_len) );
printf("f - addr start: %x; addr end: %d\n", f_addr, f_len);
return 0;
}
我不明白为什么链接器找不到“ f_enc_end”。链接器错误是:
/tmp/ccqB886f.o:在“ main”函数中:
test.c :(。text + 0x41):对`f_enc_end'的未定义引用。
更加令人困惑的是,它可以找到以类似方式构建的
f_enc_start
:collect2:错误:ld返回1退出状态
任何建议,无论朝正确方向的建议多小,都应受到赞赏。
最佳答案
我想我最终找到了解决方案。我不得不这样重写C代码:
#include <stdio.h>
#define MARK_ENCRYPTED_FUNCTION_START(NAME) \
__asm__ (#NAME "_enc_start:")
#define MARK_ENCRYPTED_FUNCTION_END(NAME) \
__asm__ (#NAME "_enc_end:")
#define GET_ENCRYPTED_FUNCTION_ADDRESS_AND_LENGHT(NAME, ADDR, LENGHT) \
__asm__ __volatile__ (\
"movl $" #NAME "_enc_start, %0\n\t"\
"movl $" #NAME "_enc_end, %1\n\t"\
: "=r"(ADDR), "=r"(LENGHT)\
)
MARK_ENCRYPTED_FUNCTION_START(f);
int f()
{
int sum = 0;
int i = 0;
for (i = 0; i < 11; ++i)
{
sum += i;
}
return sum;
}
MARK_ENCRYPTED_FUNCTION_END(f);
int main()
{
unsigned int f_addr, f_len;
GET_ENCRYPTED_FUNCTION_ADDRESS_AND_LENGHT(f, f_addr, f_len);
printf("f - addr start: %x; addr end: %x\n", f_addr, f_len);
return 0;
}
现在,它可以编译并报告开始和结束地址。现在,我必须实施实际的加密。
如果有人可以分享一些问题,这个问题将继续存在。
关于c - C宏标记功能的开始和结束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21806349/