Я портирую часть FTP-сервера vsftpd на Rust для моего проекта. Домашняя страница vsftpd
Я переписал файл opts.c
как opts.rs
, скомпилировал его как статическую библиотеку ржавчины в объектном формате как opts.o
.
У меня естьсвязал все остальные .o
файлы для соответствующих .c
файлов как CObject.o
. Теперь я пытаюсь получить исполняемый файл vsftpd
, используя Makefile, следующим образом
clang -o vsftpd CObject.o opts.o /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-c78f872a5c746c09.so -Wl,-s -fPIE -pie -Wl,-z,relro -Wl,-z,now './vsf_findlibs.sh
Но теперь я получаю следующие ошибки компоновки.
(.text.handle_opts+0x31): undefined reference to `str_upper(mystr*)'
(.text.handle_opts+0xbc): undefined reference to `str_equal_text(mystr const*, char const*)'
(.text.handle_opts+0x146): undefined reference to `vsf_cmdio_write(vsf_session*, int, char const*)'
(.text.handle_opts+0x1d1): undefined reference to `vsf_cmdio_write(vsf_session*, int, char const*)'
Но CObject.o
таблица символов содержит записи для всех вышеперечисленных записей.
Вывод readelf -s CObject.o | grep -E '(str_upper|str_equal_text|vsf_cmdio_write)'
равен
project@mylaptop:~/vsftpd-3.0.3-rustport$ readelf -s CObject.o | grep -E '(str_upper|str_equal_text|vsf_cmdio_write)'
834: 0000000000000a30 54 FUNC GLOBAL DEFAULT 1 vsf_cmdio_write
1004: 0000000000000a70 54 FUNC GLOBAL DEFAULT 1 vsf_cmdio_write_hyphen
1061: 0000000000000b90 13 FUNC GLOBAL DEFAULT 1 vsf_cmdio_write_str
1122: 0000000000000b10 97 FUNC GLOBAL DEFAULT 1 vsf_cmdio_write_exit
1127: 0000000000000ab0 94 FUNC GLOBAL DEFAULT 1 vsf_cmdio_write_raw
1211: 0000000000007df0 66 FUNC GLOBAL DEFAULT 1 str_upper
1353: 0000000000007ca0 85 FUNC GLOBAL DEFAULT 1 str_equal_text
1384: 0000000000000b80 13 FUNC GLOBAL DEFAULT 1 vsf_cmdio_write_str_hyphe
Может кто-нибудь помочь мне решить эту проблему?