Я хочу заменить 'ld' на 'gcc' в моем Makefile, чтобы связать мои объекты ядра - PullRequest
0 голосов
/ 18 января 2019

В моем проекте у меня есть make-файлы, которые собирают модули ядра Solaris, и они используют gcc для компиляции файлов, но используют ld, чтобы связать все .o файлы вместе в модуль ядра. Я пытаюсь включить некоторые варианты покрытия, такие как gcov (-fprofile-arcs) или tcov (-xprofile=tcov) в мою сборку, поэтому я хочу заменить ld на gcc во время линковки.

Но как только я заменю gcc на ld, сборки начнут давать сбой с большим количеством ошибок «неопределенный символ», даже если я использую некоторые флаги компиляции и избавлюсь от этих ошибок, модуль ядра не будет загрузить в мое ядро ​​Solaris вообще.

Например:

$ /usr/ccs/bin/ld -r -dy -Nstrmod/rpcmod -Nfs/nfs \
                  -Nmisc/rpcsec -Nmisc/klmmod -Nfs/zfs \
                  -o debug64/nfssrv \
                  debug64/nfs_server.o debug64/nfs_srv.o debug64/nfs3_srv.o \
                  debug64/nfs_acl_srv.o debug64/nfs_auth.o obj64/nfs41_srv.o \
                  obj64/ctl_ds_srv.o obj64/dserv_server.o

ld работает нормально, но с gcc я получаю следующие ошибки:

/opt/gcc-4.4.4/bin/gcc -m64 -z muldefs \
                       -Lmod/rpcmod -Lfs/nfs -Lmisc/rpcsec \
                       -Lmisc/klmmod -Lfs/zfs \
                       -o obj64/nfssrv \
                       obj64/nfs_server.o obj64/nfs_srv.o obj64/nfs3_srv.o
                       obj64/nfs_acl_srv.o obj64/nfs_auth.o obj64/nfs41_srv.o 
                       obj64/ctl_ds_srv.o obj64/dserv_server.o

Undefined                       first referenced
 symbol                             in file
hz                                  obj64/nfs_server.o
p0                                  obj64/nfs_server.o
nfs_range_set                       obj64/nfs41_srv.o
getf                                obj64/nfs_server.o
log2                                obj64/nfs4_state.o
main                                /usr/lib/amd64/crt1.o
stoi                                obj64/ctl_ds_srv.o
dmu_object_alloc                    obj64/dserv_server.o
nvpair_name                         obj64/nfs4_srv.o
__dtrace_probe_nfss41__i__destroy_encap_session obj64/nfs41_srv.o
__dtrace_probe_nfssrv__i__dscp_freeing_device_entries obj64/ctl_ds_srv.o
mod_install                         obj64/nfs_server.o
xdr_faststatfs                      obj64/nfs_server.o
xdr_WRITE3res                       obj64/nfs_server.o
svc_pool_control                    obj64/nfs_server.o

Ответы [ 2 ]

0 голосов
/ 26 января 2019

По умолчанию компоновщик GNU, вызываемый через драйвер компилятора gcc, попытается создать стандартный исполняемый файл. Следовательно, если вы не укажете иное, ld будет использовать скрипт компоновщика по умолчанию, код запуска C и будет искать подпрограмму main() и все остальное, что делает допустимый исполняемый файл.

Я не слишком знаком с Solaris, но готов поспорить, что он не подойдет для сборки модулей ядра. Я ожидаю, что модулям ядра по крайней мере потребуются некоторые параметры, такие как -ffreestanding, -nostdlibs и, скорее всего, скрипт компоновщика не по умолчанию, который, вероятно, сильно отличается от скрипта по умолчанию, используемого для приложений.

Даже если вам удастся связать свои модули ядра таким образом, я серьезно сомневаюсь, что вы закончите. Инструментальные подпрограммы gcov, скорее всего, не ожидают, что они будут жить в драйвере ядра, но ожидают правильной среды выполнения C (например, по крайней мере она будет ожидать от fopen() файла до fwrite() своих результатов). Драйвер ядра, однако, не имеет этого комфорта. Вы, вероятно, столкнетесь с проблемой, чтобы каким-то образом получить данные gcov из модулей ядра.

Не говорю, что это не выполнимо, но это, безусловно, будет много работы.

0 голосов
/ 18 января 2019

Предупреждение: опция -L позволяет указать путь для поиска библиотек, указать библиотеку, с которой вы хотите связываться (также) необходимо использовать параметр -l

Так что априори вы должны добавить опции -lrpcmod -lnfs -lrpcsec -lklmmod -lzfs

Подробнее в Параметры связывания GCC

...