二进制中的常量符号

时间:2016-02-11 17:58:23

标签: c assembly macros gnu

如果我的程序执行了

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<div class="container" style="position:relative;z-index: 400000;">

        <div class="row">

            <div class="col-lg-12">

                <div id="toppanel"> 

                    <div id="panel">

                    <div class="col-lg-8">

                        <p>We check our emails every day and reply even if we’re at dinner! Fill out the form below : )</p>

                        <div role="form" class="wpcf7" id="wpcf7-f60-o1" lang="en-US" dir="ltr">

                        <div class="shortcode">

                            <div role="form" class="wpcf7" id="wpcf7-f233-o1" lang="en-US" dir="ltr">

                                <div class="screen-reader-response"></div>
                                <form name="" action="/contact/#wpcf7-f233-o1" method="post" class="wpcf7-form" novalidate="novalidate">
                                <div style="display: none;">
                                <input type="hidden" name="_wpcf7" value="233" />
                                <input type="hidden" name="_wpcf7_version" value="4.1.2" />
                                <input type="hidden" name="_wpcf7_locale" value="en_US" />
                                <input type="hidden" name="_wpcf7_unit_tag" value="wpcf7-f233-o1" />
                                <input type="hidden" name="_wpnonce" value="8d1444dc03" />
                                </div>
                                <div>
                                <div style="float:left; width:49%">
                                <span class="wpcf7-form-control-wrap name"><input type="text" name="name" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-validates-as-required" aria-required="true" aria-invalid="false" placeholder="Name" /></span><br />
                                <span class="wpcf7-form-control-wrap surname"><input type="text" name="surname" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-validates-as-required" aria-required="true" aria-invalid="false" placeholder="Surname" /></span><br />
                                <span class="wpcf7-form-control-wrap email-404"><input type="email" name="email-404" value="" size="40" class="wpcf7-form-control wpcf7-text wpcf7-email wpcf7-validates-as-required wpcf7-validates-as-email" aria-required="true" aria-invalid="false" placeholder="Email Address" /></span><br />
                                <span class="wpcf7-form-control-wrap email-sections"><select name="email-sections" class="wpcf7-form-control wpcf7-select" aria-invalid="false"><option value="I am enquiring about...">I am enquiring about...</option><option value="Design services">Design services</option><option value="Career opportunities">Career opportunities</option><option value="Press &amp; PR">Press &amp; PR</option><option value="General enquiry">General enquiry</option></select></span>
                                </div>
                                <div style="float:right; width:50%">
                                <span class="wpcf7-form-control-wrap messege"><textarea name="messege" cols="40" rows="10" class="wpcf7-form-control wpcf7-textarea" aria-invalid="false" placeholder="Message"></textarea></span><br />
                                <input type="submit" value="SEND" class="wpcf7-form-control wpcf7-submit" />
                                </div>
                                </div>
                                <div class="wpcf7-response-output wpcf7-display-none"></div></form></div>
                                </div>
                            
                            </div>

                        </div>

                    </div>

                </div>

            </div>
            
            </div>   

        </div>

    </div>

</div>
    
                <nav class="navbar navbar-default navbar-fixed-top">
                    
                    <div class="container">

                        <div class="col-lg-12">

                            <div class="row">

                                <div class="tab contact-details">
                        
                                    <div>
                                        <a id="open" class="open" href="#">Contact Us</a> 
                                    </div>

                                </div>

                            </div>

                        </div>

                        <div class="navbar-header title">
                            <a class="navbar-brand page-scroll" href="http://localhost:8888/site/"><img src="http://placehold.it/200x100" class="logoimg"></a>
                            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                                <span class="icon-bar"></span>
                                <span class="icon-bar"></span>
                                <span class="icon-bar"></span>
                            </button>
                        </div>
                    
                    </div>

                </nav>

			</div><!-- .site-content -->

		</section>

是否可以检查生成的二进制文件以了解MAX_NUM_REL的最终值?我没有选择在程序中放置日志/打印,但我确实有生成的二进制文件。

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

3 个答案:

答案 0 :(得分:2)

不可能以这种方式检查MAX_NUM_REL的最终值:这不是一个变量,而是一个占位符,它将被你在代码实际编译之前定义的值所取代(在< em>预处理阶段)。

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

例如,如果您在C代码中的某处有以下行:

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

  • 或者您可以对已编译的代码进行反汇编以确定是否在该位置使用了10或5。但这并不容易。

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

    • 即使使用符号表,这也不是乍一看你能看到的东西,这需要一些工作。

  • 最后,即使您无法生成日志,也可以正常地逐步调试代码。这允许您检查代码中设置为MAX_NUM_REL的变量或函数参数。

答案 1 :(得分:2)

  

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

不,至少不是直接的。 MAX_NUM_REL,而不是变量。预处理器将宏名称替换为其在宏定义范围内作为预处理标记出现的扩展(无论哪个)。如果它出现在任何不完整的预处理令牌的地方,那么它就不能作为对象的名称。

如果在二进制文件中某处的文件范围变量恰好是用MAX_NUM_REL的值初始化的,例如...

int num_rel = MAX_NUM_REL;

...然后你可以在二进制文件中找到该符号的初始值,并从中推导出MAX_NUM_REL的选定值。

也可以使用预处理器来制定有关使用哪个定义的有根据的猜测。假设包含该定义的文件是mysource.c。如果能够使用用于实际编译的所有相同选项调用预处理器,则预处理此源...

include "mysource.c"

int the_value = MAX_NUM_REL;

...使用相同的选项 * 将(可能)产生一堆以

结尾的预处理C源
int the_value = 5;

int the_value = 10;

请注意,如果在源代码中的某处重新定义了MAX_NUM_REL,这可能无法给出正确的答案,但这是您可以轻松检查的内容。

如何仅运行预处理器取决于您的系统。如果您正在使用gcc,则可以使用gcc -E

* 您可能需要一个额外选项,以确保mysource.c位于包含搜索路径中。

答案 2 :(得分:0)

这实际上并不是一个符号。如果你试图搜索MAX_NUM_REL,那就不行了,因为这是一个#define,这意味着它甚至都不是一个变量,因为所有的工作都是由预处理器完成的(所以这个确切的名字不是进入二进制文件)。

要查找此值,您需要拥有源代码,然后查看此定义的使用位置,并且只有在搜索到此值被赋值的变量名称之后才会显示。