这没什么大不了的,仅是为了我的实验,但永远不会让我烦恼我无法编译此代码:

#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/

10-10 02:57