【问题标题】:Is there a way to get string literals from GCC?有没有办法从 GCC 获取字符串文字?
【发布时间】:2012-07-28 05:41:11
【问题描述】:

我在谷歌上搜索了一段时间,但没有取得丰硕的成果。我实际上正在寻找一种导出方法或一些如何获取所有字符串文字的列表,例如

int main(){
    const char *p = "Hello";
    const char x[] = "World";
}

为了编译这段代码,有没有办法知道“Hello”和“World”?我知道它们在反汇编程序中可用(在 Windows 中使用了一些)。但是是否有一些适当的工具可以实际转储这些字符串或以某种方式导出它们?

【问题讨论】:

  • 你能把你的问题说清楚一点吗?
  • 您究竟为什么要这样做?来自__FILE____func__ 的字符串呢?

标签: c++ c gcc compiler-construction


【解决方案1】:

我没有完全理解这个问题。你有一个源文件,当你编译它时,你需要 GCC 告诉你你使用了多少个字符串常量。我对此的解释是否正确?

如果是,您可以告诉 gcc 使用 "gcc -S source_file" 进行编译。这将为您提供 .s 文件,其中包含您定义的字符串常量,与 ".string" 相对。您可以解析此文件中出现的“.string”并获取计数(手动或使用“grep”管道传输到“wc -l”)

【讨论】:

    【解决方案2】:

    如果没有调试信息,您只能知道它们将被简单地放入只读数据区域(可能是 .rdata 部分,IIRC)。

    linux strings 实用程序将查看一个二进制文件,并在给定长度和编码限制内转储任何可识别的字符串。

    【讨论】:

    • strings 没有多大用处,因为它会打印很多其他垃圾。给我源代码,我可以在调试模式下编译有没有更好的工具?我认为使用 .o 文件而不是最终编译文件会更有意义。
    • 我目前无法访问合适的平台。但我在想,如果你用-g 编译,然后用readelf -a 查看可执行文件,你可能会更深入地了解这些变量。至少您应该能够获得将您(字面上)指向字符串的地址。
    • 我在 Mac 上使用了 ```gobjdump`` 没有更多提示了吗?
    • 它是.rodatareadelf -p .rodata 会做一些,但它不会找到"World",至少不是一致的——即使使用-O0,它也内联在文本部分(查看程序集)。
    • @Mat,感谢您清除其中的一些内容。你是对的。我认为对于更长的字符串,这可能会更好。
    【解决方案3】:

    为什么你需要一个 C 代码中的所有字符串常量? (在二进制文件上使用strings 实用程序可能就足够了。

    您可以自定义 GCC 编译器,例如与MELT 一起,为此目的,但这可能需要你几天的时间,我觉得这有点矫枉过正。

    您还可以从 GCC 发出汇编代码并解析该汇编代码以获得字符串常量。

    当然,您可以标记和解析预处理的表单。

    【讨论】:

    • OP 甚至不想花最少的时间编写一个短程序(在 Perl 中很简单)来识别和输出 C 字符串。
    【解决方案4】:

    编写一个识别字符串和 cmets 并忽略其他所有内容的简单标记器。

    【讨论】:

    • 我不希望这样做只会增加复杂性,因为我包含头文件和其他内容。
    • 在预处理器输出上使用它
    • 我相信一定有人做过,我为什么要采用这种笨拙又重新发明的方法?
    • @MaX 那么如果你包含头文件(没有“其他东西”)怎么办?只需在所有来源上运行该程序即可。
    • @MaX“我相信一定有人做过”——也许吧,但全世界都没有读到这篇文章。 “我为什么要采用这种笨拙和重新发明的方法?” ——呃,解决你的问题?这不是一个常见的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2014-04-07
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多