我有基于基于 linux 的嵌入式应用程序的项目。在这里,我有一个 ELF 文件,我想确保 OpenGrok 索引仅使用作为 ELF 文件一部分的符号,不包括项目文件的所有非相关/非编译部分。这可以通过 OpenGrok 索引实现吗?如果是这样,生成此索引的命令是什么。目前我使用以下命令为整个源生成索引.. java
-Djava.util.logging.config.file=/opengrok/etc/logging.properties
-jar /opengrok/dist/lib/opengrok.jar
-c / usr/local/bin/ctags
-s /opengrok/src -d /opengrok/data -H -P -S -G
-W /opengrok/etc/configuration.xml -U http://localhost:8080/source
2 回答
如果您希望仅包含/忽略特定文件(在本例中为 ELF)。您可以使用以下选项:
-I (--include) - Only files matching this pattern will be examined. Pattern supports wildcards (example: -I '*.java' -I '*.c'). Option may be repeated.
-i (--ignore) - Ignore matching files (prefixed with 'f:' or no prefix) or directories (prefixed with 'd:'). Pattern supports wildcards (example: -i '*.so' -i d:'test*'). Option may be repeated.
我不清楚项目文件的非相关/非编译部分或非链接/编译符号的确切含义,因此我将描述 ELF 文件分析在 OpenGrok 中的工作原理,您可以决定这是否适用于您的用例或如果提交新问题是有序的。
ELF 分析器经过以下 ELF 部分:
.debug_str
.comment
.data
.data1
.rodata
.rodata1
加上sh_type
等于 的所有部分SHT_STRTAB
。后者包含由空字节分隔的字符串。分析器从这些部分的内容中提取所有可打印字符串(使用不可打印字符作为分隔符)并将它们与空格字符连接起来。因此,所有这些部分的所有可打印字符串都会累积成单个字符串,并由插入的空格有效地标记。这些标记然后存储在索引中,因此变得可搜索。
使用这种方法,索引不仅包含程序中定义的符号,还包含程序引用的外部符号的名称(例如从动态库调用的函数),以及一些全局变量的内容(如果它们包含可打印的字符串) .
此外,当 ELF 二进制文件被剥离时,该.symtab
部分将被删除,并且程序中定义的符号名称会丢失给索引器。
现在,可以以更智能的方式遍历 ELF 部分并排除外部引用(例如对动态库函数的调用),但这会阻碍最初的想法,即有一种方法来执行安全漏洞分析 - 如果它是知道哪个函数有问题,就可以搜索所有调用该函数的二进制文件,从而对安全影响有所了解。或者,可以将提取的标记拆分为引用和定义。