ld не удалось, потому что libselinux имеет неопределенную ссылку на gettid@GLIBC_2.30

Я пытаюсь собрать glibc 2.24 из исходников. Хост-ОС — WSL Ubuntu 20.04, компилятор — gcc 9.

Утилите ld не удалось связать модуль nss glibc:

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libselinux.so: undefined reference to `gettid@GLIBC_2.30'
collect2: error: ld returned 1 exit status

Похоже, что libselinux.so содержит неопределенный символ gettid@GLIBC_2.30. Я исследовал libselinux.so и обнаружил, что это так:

$ readelf -Ws /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libselinux.so | grep gettid
    13: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND gettid@GLIBC_2.30 (4)

Поскольку libselinux.so загружается ld, я дополнительно проверил зависимость ld:

$ ldd /usr/bin/ld
        linux-vdso.so.1 (0x00007fffd365c000)
        libbfd-2.34-system.so => /lib/x86_64-linux-gnu/libbfd-2.34-system.so (0x00007f144c410000)
        libctf.so.0 => /lib/x86_64-linux-gnu/libctf.so.0 (0x00007f144c3f0000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f144c3e0000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f144c1e0000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f144c1c0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f144c713000)

Я обнаружил, что libc.so.6 будет загружен, когда будет загружен ld. Но когда я дополнительно проверил символы, определенные в libc.so.6, я обнаружил, что gettid@GLIBC_2.30 уже определено:

$ readelf -Ws /lib/x86_64-linux-gnu/libc.so.6 | grep gettid
  1329: 00000000001231c0    12 FUNC    WEAK   DEFAULT   16 gettid@@GLIBC_2.30

Я действительно смущен. Почему появляется проблема неопределенной ссылки? И как мне ее решить?


person Lancern    schedule 12.10.2020    source источник


Ответы (1)


Тот факт, что вы обнаружили, что libc.so.6 загружается с помощью ld, означает, что ld будет использовать функции из этой библиотеки, но не означает, что она будет компоноваться с ней.

Если вы хотите, чтобы ld снова связался с этой библиотекой, вам нужно добавить -Lpath и -lc. Но обычно, если вы связываетесь с gcc, он автоматически связывается с libc.

person yflelion    schedule 06.11.2020