使用GCC / binutils对符号进行别名工作是间歇性的

我正在开发一些有限时间运行裸机的软件,直到Linux端口准备好进入黄金时段。 该软件正在与uClibc链接,uClibc提供了malloc,clock_gettime等的实现,但问题是它们都依赖于系统调用,因为我们还没有内核来处理它们,因此只会陷阱硬件。

我一直在使用别名来覆盖我们需要的函数,即our_mem.c:

void* our_malloc(size_t size) { .. } void* malloc(size_t size) __attribute__ ((malloc, weak, alias("our_malloc"))); 

问题是,这似乎有点随机。 我可以有一个构建,其中所有调用都是正确的别名,在下一个构建中,我在一个不相关的文件中修改了它,它突然工作到一个点,然后其中一个调用转到uClibc malloc。 起初我认为这是链接顺序的问题,但构建系统始终以相同的顺序链接,同一个调用将在一个构建中工作,并在下一个构建中失败。 二进制文件(显然)是静态链接的。

我不确定这究竟是如何使用别名的,因为我没有找到很多关于它的文档但我几年前在malloc和朋友(也使用uClibc)上成功使用了这种技术然后它一直工作。