首页 > 解决方案 > 由于 -allow-shlib-undefined 链接器开关而产生的符号查找错误是否有任何解决方案?

问题描述

我试图了解 gnu 链接器的“-allow-shlib-undefined”开关的用法。为此,我编写了 libfoo.so 和 libfunc.so。

//libfoo.h
void say_hello(void);
//libfoo.c
#include <stdio.h>
#include "libfoo.h"
#include "libfunc.h"

void say_hello(void)
{
   printf("Hello\n");
   say_goodbye();
}
//libfunc.h
void say_goodbye(void);
//libfunc.c
#include <stdio.h>
#include "libfunc.h"

void say_goodbye(void)
{
    printf("Goodbye!\n");
}

我使用以下 gcc 命令编译 libfoo 和 libfunc:

gcc -c libfoo.c -o libfoo.o
gcc -shared -o libfoo.so libfoo.o

gcc -c libfunc.c -o libfunc.o
gcc -shared -o libfunc.so libfunc.o 

然后我写了以下“主要”代码:

#include "libfoo.h"
int main(void) {
    say_hello();
}

然后我尝试使用以下 gcc 命令编译此代码:

gcc -L<path-to-libs> main.c -o main -lfoo

如我所料,此命令发生错误。(因为我没有链接 libfunc.so)然后我使用以下 gcc 命令编译 main.c:

gcc -L<path-to-libs> -Wl,-allow-shlib-undefined main.c -o main -lfoo

使用此命令编译成功。但是当我运行 main 我得到以下错误:

Hello
./main: symbol lookup error: /home/sarslan/shlib-undefined/libfoo.so: undefined symbol: say_goodbye

有没有办法解决这个错误?

标签: clinker

解决方案


有没有办法解决这个错误?

是的:该标志适用于您知道在运行时提供缺少的功能但(无论出于何种原因)您无法在链接时提供其定义的情况。

为了让你的程序工作,你必须在运行时提供一个不同 libfoo.so的;一个要么

  1. 不打电话say_goodby(),或
  2. 提供了自己的定义say_goodby()

或者,您可以使用LD_PRELOAD=./libfunc.so.

当心:使用LD_PRELOAD有许多潜在的并发症,而且几乎从来都不是正确的解决方案。

PS您正在构建没有-fPIC. 这在许多架构上都不起作用,并且在它确实起作用的系统上不是最理想的。


推荐阅读