Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 二进制中的常量符号_C_Assembly_Macros_Gnu - Fatal编程技术网

C 二进制中的常量符号

C 二进制中的常量符号,c,assembly,macros,gnu,C,Assembly,Macros,Gnu,如果我的程序运行正常 #ifdef USE_REL_DEF # define MAX_NUM_REL 10 #else # define MAX_NUM_REL 5 #endif 是否可以检查生成的二进制文件以了解MAX_NUM_REL的最终值?我没有在程序中添加日志/打印的选项,但我有生成的二进制文件 我尝试使用nm和objdump,但没有找到符号的值。这实际上不是一个符号。如果您试图搜索MAX_NUM_REL,那是不好的,因为这是一个\define,这意味着它甚至不是一个变量,因为所有

如果我的程序运行正常

#ifdef USE_REL_DEF
#  define MAX_NUM_REL 10
#else
#  define MAX_NUM_REL 5
#endif
是否可以检查生成的二进制文件以了解MAX_NUM_REL的最终值?我没有在程序中添加日志/打印的选项,但我有生成的二进制文件


我尝试使用nm和objdump,但没有找到符号的值。

这实际上不是一个符号。如果您试图搜索
MAX_NUM_REL
,那是不好的,因为这是一个
\define
,这意味着它甚至不是一个变量,因为所有的工作都是由预处理器完成的(因此这个确切的名称不会进入二进制文件)


要找到此值,您需要有源代码,然后查看此定义在何处使用,并且只有在搜索变量名称后,才会将此值指定给。

这实际上不是一个符号。如果您试图搜索
MAX_NUM_REL
,那是不好的,因为这是一个
\define
,这意味着它甚至不是一个变量,因为所有的工作都是由预处理器完成的(因此这个确切的名称不会进入二进制文件)


要找到此值,您需要有源代码,然后查看此定义在何处使用,并且只有在搜索该值分配给的变量的名称之后才可以使用此定义。

无法通过这种方式检查
MAX\u NUM\u REL
的最终值:这不是一个变量,而是一个占位符,将由您指定的值替换在实际编译代码之前定义(在预处理阶段)

您唯一可以控制的是使用它的后果:

例如,您的C代码中是否应该有以下行:

 int myIntegerVariable = MAX_NUM_REL;
  • 您可以通过在代码上运行预处理器(只是预处理器,而不是编译器)来查看实际使用的值:这将生成另一个C文件,其实际值(
    int myIntegerVariable=5;
    )将替换为
    MAX\u NUM\u REL
    )。您必须参考正在使用的编译器的文档,以了解如何在文件上运行预处理器

  • 或者,您可以分解编译后的代码,以确定在该位置使用的是10还是5。但这并不容易

    • 符号
      myIntegerVariable
      在二进制代码中不会出现。这是一个符号,只有在使用调试选项编译程序时,您才能跟踪该符号,该选项在二进制文件中保持符号表可用

    • 即使使用符号表,这也不是您第一眼就能发现的,这需要一些工作

  • 最后,即使不能生成日志,也可以正常地对代码进行逐步调试。这允许您检查代码中设置为
    MAX\u NUM\u REL
    的变量或函数参数


不可能以这种方式检查
MAX_NUM_REL
的最终值:这不是一个变量,而是一个占位符,将由您在实际编译代码之前(预处理阶段)定义的值替换

您唯一可以控制的是使用它的后果:

例如,您的C代码中是否应该有以下行:

 int myIntegerVariable = MAX_NUM_REL;
  • 您可以通过在代码上运行预处理器(只是预处理器,而不是编译器)来查看实际使用的值:这将生成另一个C文件,其实际值(
    int myIntegerVariable=5;
    )将替换为
    MAX\u NUM\u REL
    )。您必须参考正在使用的编译器的文档,以了解如何在文件上运行预处理器

  • 或者,您可以分解编译后的代码,以确定在该位置使用的是10还是5。但这并不容易

    • 符号
      myIntegerVariable
      在二进制代码中不会出现。这是一个符号,只有在使用调试选项编译程序时,您才能跟踪该符号,该选项在二进制文件中保持符号表可用

    • 即使使用符号表,这也不是您第一眼就能发现的,这需要一些工作

  • 最后,即使不能生成日志,也可以正常地对代码进行逐步调试。这允许您检查代码中设置为
    MAX\u NUM\u REL
    的变量或函数参数

是否可以检查生成的二进制文件以了解MAX_NUM_REL的最终值

不,至少不是直接的
MAX_NUM_REL
是一个宏,而不是一个变量。预处理器将在宏定义范围内作为预处理标记出现的所有位置使用其扩展名(以两者中的任何一个为准)替换宏名称。如果它出现在不是完整预处理标记的任何地方,则不能作为对象的名称

如果二进制文件中的某个地方碰巧有一个文件作用域变量,该变量用
MAX\u NUM\u REL
值初始化,例如

int num_rel = MAX_NUM_REL;
。。。然后,您可以在二进制文件中找到该符号的初始值,并由此推断所选的
MAX\u NUM\u REL

也可以使用预处理器对使用的定义进行有根据的猜测。假设包含该定义的文件是
mysource.c
。如果您能够使用实际编译中使用的所有相同选项调用预处理器,则预处理此源代码

include "mysource.c"

int the_value = MAX_NUM_REL;
。。。使用这些相同的选项*将(可能)产生一堆预处理的C源代码,以

int the_value = 5;

请注意,如果在源代码中的某个地方重新定义了
MAX\u NUM\u REL
,那么这可能不会给您提供正确的答案,但是您可以很容易地进行检查

如何仅运行预处理器取决于您的系统。如果您使用的是
gcc
th