c - GCC的函数指针,分配地址

标签 c gcc function-pointers

我遇到了一些我完全不明白的事情。 有一个函数原型(prototype):

typedef void ( * TMain ) ( void );

和一个函数变量:

TMain myFunc = MyFunc;
...
myFunc ();

当然,这很好用。为什么不呢。

从 MAP 文件中我知道“MyFunc”位于位置 0x20100。 现在有趣的是。赋值后“myFunc = MyFunc;”变量“myFunc”包含值 0x20100,而是 0x20101!

我的问题是,我需要调用一个我从表中知道地址的函数。所以我想我可以那样做

myFunc = ( TMain ) myTable [ 5 ];    // that would be 0x20100
myFunc ();                           // which produces a proper crash

但是如果我这样做

myFunc = ( TMain ) ( ( Int8 * ) myTable [ 5 ] + 1 );  
myFunc ();

然后就可以了。

这里发生了什么?我是否总是必须添加 1 的偏移量,或者这或多或少是偶然的? 还是有更好的(有效的)方法来完成任务?

非常感谢任何提示。 沃尔特

最佳答案

我猜你是在 ARM 目标上,并且你已经在 Thumb 模式下构建了你的程序? (Thumb 在 ARM Ubuntu 或 Linaro 上是默认的。)

函数地址的最低位告诉 CPU 它应该在哪个指令集中解释该函数。 0 是 ARM 模式。 1 是拇指模式。因此所有 Thumb 模式的函数指针都是奇数。

其他架构也以这样或那样的方式使用这个习语。通常将地址的低两位置零(使其 4 字节对齐)并假设这是函数的真实位置是安全的。

关于c - GCC的函数指针,分配地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9093386/

相关文章:

c - 何时使用 OpenGL 显示列表?

c - 在C语言编程中制作连续的字符串

c - 为什么 GCC 在尝试返回结构指针时给我一个语法错误?

gcc - 编译gcc-4.1

c++ - 在 C++ 中,为什么无法初始化指向函数的指针?

c - 如何用表格制作 "global variable"?

c - 如何设置 l2tp 预共享 key ?

c - 为什么 scanf() 会导致此代码中的无限循环?

c - 在 C 中获取函数指针的这些方法有区别吗?

c - 在C中获取所有带前缀的函数