gpt4 book ai didi

用于标记函数开始和结束的 C 宏

转载 作者:行者123 更新时间:2023-11-30 17:39:27 27 4
gpt4 key购买 nike

这没什么严重的,只是为了我的实验,但无论如何,我无法编译这段代码,这让我很恼火:

#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: In function `main': test.c:(.text+0x41): undefined reference to `f_enc_end'.

更令人费解的是,它可以找到以类似方式构建的f_enc_start:

collect2: error: ld returned 1 exit status

任何建议,无论朝着正确的方向有多小,我们都会表示赞赏。

最佳答案

我想我最终找到了解决方案。我必须这样重写 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 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21806349/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com