gpt4 book ai didi

c - gcc,如何强制最终可执行文件链接未使用的共享库?

转载 作者:行者123 更新时间:2023-12-02 18:07:41 55 4
gpt4 key购买 nike

我有一个可执行文件 shared_main 、一个共享库 libbar.so 和一个动态加载共享库 libfoo.so (加载到 >shared_main 通过 dlopen)。

shared_main 不使用 libbar.so 中的任何符号,但 libfoo.so 使用。

因此 gcc -g -Wall -o shared_main shared_main.c libbar.so -ldl 不会将 libbar.so 链接到 shared_main 。通过ldd shared_main检查。

如何让gcc强制shared_main链接libbar.so

附注我知道我可以将 libfoo.solibbar.so 链接。但我想尝试一下是否可以强制 shared_main 在此处链接 libbar.so


shared_main.c

#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>

int main(){
void* libHandle = dlopen("./libfoo.so", RTLD_LAZY);
if(libHandle == NULL){
printf("dlopen:%s", dlerror());
exit(1);
}
int(*xyz)(int);
xyz = (int(*)(int)) dlsym(libHandle, "xyz");
if(xyz == NULL){
printf("dlsym:%s", dlerror());
exit(1);
}
int b = xyz(3);
printf("xyz(3): %d\n", b);

}

foo.c (libfoo.so)

void func_in_bar();
int xyz(int b){
func_in_bar();
return b + 10;
}

bar.c (libbar.so)

//mimic python share library runtime
#include <stdio.h>
void func_in_bar(){
printf("I am a Function in bar\n");
}

void another_func_in_bar(){
printf("I am another function in bar\n");
}

生成文件

shared_main:
gcc -g -Wall -o shared_main shared_main.c libbar.so -ldl
shared:
gcc -g -Wall -fPIC -shared -o libfoo.so foo.c
gcc -g -Wall -fPIC -shared -o libbar.so bar.c

最佳答案

您遇到了 XY 问题,其中 X 是:libfoo 有未解析的符号,但链接器不会对此发出警告

因此,请在链接时使用 -z defs 选项,当您收到有关未解析符号的链接器错误时,请将 -lfoo 添加到链接命令中。

这还不够,您还必须使用 -L-Wl,-rpath 选项。这是一个完整的 Makefile:

# Makefile

# LIBDIR should be the final place of the shared libraries
# such as /usr/local/lib or ~/libexec/myproject

LIBDIR := ${PWD}
TARGETS := shared_main libbar.so libfoo.so

all: ${TARGETS}

clean:
rm -f ${TARGETS} 2>/dev/null || true

shared_main: shared_main.c
gcc -g -Wall -o shared_main shared_main.c -ldl

libbar.so: bar.c
gcc -g -Wall -fPIC -shared -o libbar.so bar.c

libfoo.so: foo.c libbar.so
gcc -g -Wall -fPIC -shared -z defs -o libfoo.so foo.c \
-L${LIBDIR} -Wl,-rpath,${LIBDIR} -lbar

编辑:尽管如此,这里有一个针对原始问题的黑客解决方案:使用选项-Wl,--no-as-needed

shared_main:
gcc -g -Wall -o shared_main shared_main.c \
-Wl,--no-as-needed -Wl,-rpath,${PWD} libbar.so -ldl

关于c - gcc,如何强制最终可执行文件链接未使用的共享库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72919955/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com