【问题标题】:Compiler changing function names编译器更改函数名称
【发布时间】:2014-03-05 08:37:32
【问题描述】:

我遇到了这种奇怪的情况。我正在尝试取消一些覆盆子 pic 库函数的前缀。例如,我希望 bcm2835_delay() 为 delay()。我有两个文件,pi.h 和 pic.c。当我用gcc -lm pi.c -c 编译这两个时,我的去前缀延迟()变为bcm2835_delay()。下面是我的两个文件和objdump -t pi.o的输出。

pi.h

#include <bcm2835.h>

#define PIN05 RPI_V2_GPIO_P1_05
#define PIN07 RPI_V2_GPIO_P1_07
#define PIN08 RPI_V2_GPIO_P1_08
#define PIN10 RPI_V2_GPIO_P1_10
#define PIN11 RPI_V2_GPIO_P1_11
#define PIN12 RPI_V2_GPIO_P1_12
#define PIN13 RPI_V2_GPIO_P1_13
#define PIN15 RPI_V2_GPIO_P1_15
#define PIN16 RPI_V2_GPIO_P1_16
#define PIN18 RPI_V2_GPIO_P1_18
#define PIN19 RPI_V2_GPIO_P1_19
#define PIN21 RPI_V2_GPIO_P1_21
#define PIN22 RPI_V2_GPIO_P1_22
#define PIN23 RPI_V2_GPIO_P1_23
#define PIN24 RPI_V2_GPIO_P1_24
#define PIN26 RPI_V2_GPIO_P1_26

#define INPUT BCM2835_GPIO_FSEL_INPT
#define OUTPUT BCM2835_GPIO_FSEL_OUTP

// rename the delay function given already
void delay(unsigned int millis);

// rename the microsecond delay function
void delay_micro(uint64_t micros);

// set the pinout to low, check that the pin is output
void set_low(uint8_t pin);

// ease the input setting
void set_input(uint8_t pin);

// ease the output setting
void set_output(uint8_t pin);

和 pic.c

#include <bcm2835.h>
#include "pi.h"

// rename the delay function given already
void delay(unsigned int millis) {
  bcm2835_delay(millis);
}

// rename the microsecond delay function
void delay_micro(uint64_t micros) {
  bcm2835_delayMicroseconds(micros);
}

// set the pinout to low, check that the pin is output
void set_low(uint8_t pin) {

}

// ease the input setting
void set_input(uint8_t pin) {
  bcm2835_gpio_fsel(pin, INPUT);
}

// ease the output setting
void set_output(uint8_t pin) {
  bcm2835_gpio_fsel(pin, OUTPUT);
}

输出

pi.o:文件格式elf32-littlearm

SYMBOL TABLE:
00000000 l    df *ABS*  00000000 pi.c
00000000 l    d  .text  00000000 .text
00000000 l    d  .data  00000000 .data
00000000 l    d  .bss 00000000 .bss
00000000 l    d  .note.GNU-stack  00000000 .note.GNU-stack
00000000 l    d  .comment 00000000 .comment
00000000 l    d  .ARM.attributes  00000000 .ARM.attributes
00000000 g     F .text  00000020 bcm2835_delay
00000020 g     F .text  00000020 delay_micro
00000000         *UND*  00000000 bcm2835_delayMicroseconds
00000040 g     F .text  00000020 set_low
00000060 g     F .text  0000002c set_input
00000000         *UND*  00000000 bcm2835_gpio_fsel
0000008c g     F .text  0000002c set_output

在这里,您可以看到我的所有函数定义都很好地添加到了符号表中,除了 delay() 函数。在符号表中,它显示为 bcm2835_delay。如果我将 delay() 更改为 my_delay() ,它会以 my_delay() 的形式进入符号表。这是怎么回事?

【问题讨论】:

  • #undef delay放在#includes之后再试一次。
  • 可能是自动内联了。
  • #undef delay 是正确的答案,你能解释一下这是怎么回事吗?

标签: c compilation symbol-table


【解决方案1】:

编译器将您的函数视为内联函数。

【讨论】:

    猜你喜欢
    • 2022-08-04
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多