无法在 Alpine 上动态链接

问题描述 投票:0回答:1

由于某种原因,我无法将 so 文件动态链接到在 Alpine 容器中使用 clang 构建的最小 C 应用程序 - 在我的 Archlinux 上构建时,它可以工作。

该应用程序如下所示,它只是调用共享库中的随机函数。我也尝试过其他库,结果相同。

main.c

#include <jansson.h>
#include <stdio.h>

int main(void) {
  printf("Hello, world!\n");

  // call a random function from a shared lib
  json_object();
  return 0;
}

我有一个非常基本的 Makefile:

CC = clang
CFLAGS = -Wall -Wextra -O2
DEPS = $(wildcard *.h)
SRC = $(wildcard *.c)
OBJ = $(SRC:.c=.o)
TARGET = app

%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

$(TARGET): $(OBJ)
    $(CC) -v -L /usr/lib -ljansson -o $@ $^ $(CFLAGS)

.PHONY: clean

clean:
    rm -f $(OBJ) $(TARGET)

我使用以下命令启动 Docker 容器并安装所需的软件包:

docker run --rm -it -v $PWD:/work -w /work alpine

apk update
apk add clang make jansson-dev

最后,我会尝试构建,但失败了,如下所示:

/work # make
clang -c -o main.o main.c -Wall -Wextra -O2
clang -v -L /usr/lib -ljansson -o app main.o -Wall -Wextra -O2
Alpine clang version 17.0.5
Target: x86_64-alpine-linux-musl
Thread model: posix
InstalledDir: /usr/bin
Configuration file: /etc/clang17/x86_64-alpine-linux-musl.cfg
System configuration file directory: /etc/clang17
Found candidate GCC installation:
/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/13.2.1 Selected GCC installation:
/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/13.2.1 Candidate multilib: .;@m64
Selected multilib: .;@m64
 "/usr/bin/ld" -pie -z now -z relro --hash-style=gnu --build-id --eh-frame-hdr
-m elf_x86_64 -dynamic-linker /lib/ld-musl-x86_64.so.1 -o app /usr/lib/Scrt1.o
/usr/lib/crti.o /usr/bin/../lib/gcc/x86_64-alpine-linux-musl/13.2.1/crtbeginS.o
-L/usr/lib -L/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/13.2.1
-L/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/13.2.1/../../../../x86_64-alpine-linux-musl/lib
-L/lib -L/usr/lib --as-needed -ljansson main.o -lssp_nonshared -lgcc --as-needed
-lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/bin/../lib/gcc/x86_64-alpine-linux-musl/13.2.1/crtendS.o /usr/lib/crtn.o
/usr/bin/ld: main.o: in function `main':
main.c:(.text+0xe): undefined reference to `json_object'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:12: app] Error 1

为了确定,so 文件就是我所期望的。

/work # ls /usr/lib/libjansson*
/usr/lib/libjansson.so         /usr/lib/libjansson.so.4       /usr/lib/libjansson.so.4.14.0

如果我在 Archlinux 或 Ubuntu 容器中执行相同的操作,它会按预期工作。

我错过了什么?

clang shared-libraries alpine-linux dynamic-linking musl
1个回答
0
投票

我错过了什么?

您的链接命令是错误的:库应该follow引用它们的对象。将

-ljansson
移动到链接线上的
$^
之后。

© www.soinside.com 2019 - 2024. All rights reserved.