c-在OSX/iOS上使用Clang获取分区地址



很长一段时间以来,我一直在使用链接器部分来注册运行时使用的元素。我发现这是一种制作通用和可扩展接口的简单方法。一个特别有用的用例是类似于单元测试或多工具(例如busybox(的东西,因此可以执行以下操作:

$ ./tool <handler>

其中处理程序是一个简单字符串;looked up";在运行时,通过遍历链接器部分。通过这种方式,您的解析器不必"知道";支持哪些命令。它只是在专用于它们的链接器部分中找到它们的处理程序,或者没有。

对于GCC,我一直在做一些类似的事情(你也可以用Clang来做(:

#define __tool __attribute__((__section__("tools")))

然后,我想注册的每个处理程序都会得到一个简单的结构(根据需要或多或少地提供信息(

struct tool {
const char *name;
const char *help;
int (*handler)(int argc, char **argv);
}

然后,对于每个工具,你只需要做一些类似的事情(通常很方便地封装在宏中(:

int example_tool0(int argc, char **argv)
{
return -1;
}
static const struct tool example_tool0 = {
.name = "exmaple_tool0",
.help = "usage: ...",
.handler = example_tool0
};
__tool static const struct tool *ptr = &example_tool0;

并使用了这样一个:

$ ./tool example_tool0

由于__tool,以这种方式注册的每个指针都被打包到一个可以遍历的链接器部分中。

现在,在GCC上,链接器为每个部分创建两个神奇的变量:__start_SECTION__stop_SECTION。因此,对于";步行;在我们所有注册的处理程序中,您只需要取该部分的大小,除以指针的大小,然后根据结构中的名称(在本例中(使用strncmp


以上所有内容都只是说,如何使用基于OSX/iOS-Clang的工具链来实现这一点?我宁愿不使用自定义链接器脚本来实现这个看似简单的操作。

在OSX上有办法做到这一点吗?我通过在本节开头和结尾注册一个空条目来解决这个问题。但这样做需要强制对象文件的链接顺序。

虽然OSX/iOS使用Clang作为平台编译器,但它们不使用LLVM链接器。相反,无论出于何种原因,他们都实现了自己的ld64(它是开源的(。因此,它可能只是得不到支持。我在OSX上的man ld中没有看到任何东西,但它有点信息密集。

供ELF和GCC 参考

所以其他人已经回答了这个问题。我搜索了,但我一定错过了这个答案。事实上,我以前已经多次寻找这个问题的答案,但肯定从来没有用对词。

https://stackoverflow.com/a/22366882/2446071

总之,显然链接器支持自己定义这些所需符号的语法:

extern char __start_SECTION __asm("section$start$SEGMENT$SECTION");
extern char __stop_SECTION  __asm("section$end$SEGMENT$SECTION");

相关内容

  • 没有找到相关文章

最新更新