Compilation d’Apache Server à l’aide de LLVM Plus un Pass personnalisé et une bibliothèque personnalisée

Nous aimerions utiliser LLVM pour comstackr apache 2.2.19. Dans le processus de compilation, nous souhaitons append une passe personnalisée à clang en spécifiant la variable d’environnement CFLAGS :

 CFLAGS="-Xclang -load -Xclang mypass.so" 

Ensuite, lors de l’étape de liaison, nous voulons également que l’exécutable soit lié à une bibliothèque dynamic personnalisée. Nous avons donc exporté ces deux variables d’environnement:

 LDFLAGS="-L. -lmylib" LD_LIBRARY_PATH='./libfolder' 

Nous avons utilisé ces variables d’environnement lors de la compilation de MySQL, et cela a fonctionné comme prévu. Cependant, pour comstackr Apache, nous avons rencontré l’erreur suivante:

 /usr/bin/ld: cannot find -load 

Il semble que l’éditeur de liens lit également les indicateurs du compilateur et interprète alors -load comme une bibliothèque … Pourriez-vous me dire comment je peux me débarrasser de ce problème?

Ci-dessous plus de détails:

Voici la commande que j’ai utilisée pour configurer apache:

 CC=clang CXX=clang++ CFLAGS="-Xclang -load -Xclang /home/my/software/llvm-build/Debug+Asserts/lib/mypass.so" CXXFLAGS="-Xclang -load -Xclang /home/my/software/llvm-build/Debug+Asserts/lib/mypass.so" LDFLAGS="-ldl -L/home/my/Projects/lib/ -lmylib" LD_LIBRARY_PATH="/home/my/Projects/lib/" ./configure 

L’erreur après avoir couru make est ici:

 /bin/bash /home/my/Downloads/httpd-2.2.19/srclib/apr/libtool --silent --mode=link clang -Xclang -load -Xclang /home/my/software/llvm-build/Debug+Asserts/lib/mypass.so -DHAVE_CONFIG_H -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -I./include -I/home/my/Downloads/httpd-2.2.19/srclib/apr/include/arch/unix -I./include/arch/unix -I/home/my/Downloads/httpd-2.2.19/srclib/apr/include/arch/unix -I/home/my/Downloads/httpd-2.2.19/srclib/apr/include -version-info 4:5:4 --verbose -ldl -L/home/my/Projects/lib/ -lmylib-o libapr-1.la -rpath /usr/local/apache2/lib passwd/apr_getpass.lo ssortingngs/apr_cpystrn.lo ssortingngs/apr_fnmatch.lo ssortingngs/apr_snprintf.lo ssortingngs/apr_ssortingngs.lo ssortingngs/apr_strnatcmp.lo ssortingngs/apr_strtok.lo tables/apr_hash.lo tables/apr_tables.lo atomic/unix/builtins.lo atomic/unix/ia32.lo atomic/unix/mutex.lo atomic/unix/ppc.lo atomic/unix/s390.lo atomic/unix/solaris.lo dso/unix/dso.lo file_io/unix/buffer.lo file_io/unix/copy.lo file_io/unix/dir.lo file_io/unix/fileacc.lo file_io/unix/filedup.lo file_io/unix/filepath.lo file_io/unix/filepath_util.lo file_io/unix/filestat.lo file_io/unix/flock.lo file_io/unix/fullrw.lo file_io/unix/mktemp.lo file_io/unix/open.lo file_io/unix/pipe.lo file_io/unix/readwrite.lo file_io/unix/seek.lo file_io/unix/tempdir.lo locks/unix/global_mutex.lo locks/unix/proc_mutex.lo locks/unix/thread_cond.lo locks/unix/thread_mutex.lo locks/unix/thread_rwlock.lo memory/unix/apr_pools.lo misc/unix/charset.lo misc/unix/env.lo misc/unix/errorcodes.lo misc/unix/getopt.lo misc/unix/otherchild.lo misc/unix/rand.lo misc/unix/start.lo misc/unix/version.lo mmap/unix/common.lo mmap/unix/mmap.lo network_io/unix/inet_ntop.lo network_io/unix/inet_pton.lo network_io/unix/multicast.lo network_io/unix/sendrecv.lo network_io/unix/sockaddr.lo network_io/unix/socket_util.lo network_io/unix/sockets.lo network_io/unix/sockopt.lo poll/unix/epoll.lo poll/unix/kqueue.lo poll/unix/poll.lo poll/unix/pollcb.lo poll/unix/pollset.lo poll/unix/port.lo poll/unix/select.lo random/unix/apr_random.lo random/unix/sha2.lo random/unix/sha2_glue.lo shmem/unix/shm.lo support/unix/waitio.lo threadproc/unix/proc.lo threadproc/unix/procsup.lo threadproc/unix/signals.lo threadproc/unix/thread.lo threadproc/unix/threadpriv.lo time/unix/time.lo time/unix/timestr.lo user/unix/groupinfo.lo user/unix/userinfo.lo -luuid -lrt -lcrypt -lpthread /usr/bin/ld: cannot find -load clang: error: linker command failed with exit code 1 (use -v to see invocation) make[3]: *** [libapr-1.la] Error 1 make[3]: Leaving directory `/home/my/Downloads/httpd-2.2.19/srclib/apr' make[2]: *** [all-recursive] Error 1 make[2]: Leaving directory `/home/my/Downloads/httpd-2.2.19/srclib/apr' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/home/my/Downloads/httpd-2.2.19/srclib' make: *** [all-recursive] Error 1 

J’ai trouvé une solution, même si je ne suis pas sûr à 100% de la cause première.

Il semble que le fichier de configuration d’apache mette en parallèle les drapeaux du compilateur et les drapeaux de l’éditeur de liens. Donc, ce que nous pouvons faire est de trouver toutes les déclarations liées au lien dans configure. Par exemple, nous utilisons la commande suivante dans le répertoire racine:

 grep -r '\--mode=link' . 

Ensuite, nous allons à chaque fichier de configuration et supprimez $ (COMPILE)

Vous pourriez également rencontrer un problème de tag, qui peut être résolu de cette façon: https://forums.gentoo.org/viewtopic-t-915572-start-0.html

De plus, comme nous lions une bibliothèque dynamic, nous devons exporter le bon LD_LIBRARY_PATH avant de lancer l’exécution.