C仅导出所需符号(不编辑原始文件)

时间:2015-11-22 17:16:29

标签: c symbols flex-lexer

首先,一些最小的代码:

// file "t1.h":
int get1();

// file "t1.c":
int get1(){return 1;}

// file "t2.h":
int get2();

// file "t2.c":
int get1(){return 99;} // <- duplicate definition of get1(), I would like to hide it somehow
int get2(){return 2;}

// file "t3.c":
#include <stdio.h>
#include "t1.h"
#include "t2.h"

int main(int argc, char ** argv) {
    printf("%d\n", get1());
    printf("%d\n", get2());
}

编译命令

gcc -c t1.c  &&  gcc -c t2.c  &&  gcc -c t3.c  &&  gcc t1.o t2.o t3.o -o t3`

结果是错误:

t2.c:(.text+0x0): multiple definition of 'get1'.

问题很明显,get1()定义了两次。

为什么我仍在寻找解决方案?

  • 我不需要get1()的第二个定义,我想丢弃它隐藏它。
  • 从文件中删除它,将其标记为static或重命名它对我不起作用,因为“t1.c”和“t2.c”会自动生成。

问题:

有没有办法以某种方式隐藏所选符号而不修改.c文件?

或者仅显示所选符号。

或重命名。

类似于:gcc -c t2.c --hide-symbol=get1

我想要这个的更多细节:

有程序flex生成lexer .c文件。

有可能通过重新定义宏来改变某些行为。

我需要生成两个不同的词法分析器,它们都由同一个程序使用。

编辑:实际解决方案

flex中,可以将注释中提到的前缀从“yy *”更改为“somethingelse *”。

http://westes.github.io/flex/manual/Code_002dLevel-And-API-Options.html#index-prefix

1 个答案:

答案 0 :(得分:0)

程序员可以使用关键字static隐藏符号。任何未声明为static的符号在目标文件的全局命名空间中都可见。

可能有一个目标文件编辑器,允许您重命名导出的符号,但Google没有显示任何结果。您始终可以编辑二进制对象文件 - 确保名称保持相同的长度,以免以后混淆链接器。