Apakah mungkin perpustakaan linux (mis. "libloader.so") memuat perpustakaan lain untuk menyelesaikan simbol eksternal?
Saya punya banyak kode yang dikompilasi secara kondisional agar level SIMD didukung ( SSE2, AVX, AVX2 ). Ini berfungsi dengan baik jika platform build sama dengan platform runtime. Namun hal ini menghambat penggunaan kembali pada generasi prosesor yang berbeda.
Salah satu pemikirannya adalah memiliki executable
yang memanggil function
tautan ke libloader.so
yang tidak secara langsung mengimplementasikan function
. Sebaliknya, ia menyelesaikan (mengikat?) simbol itu dari perpustakaan lain yang dimuat, mis. libimpl_sse2.so
, libimpl_avx2.so
atau seterusnya tergantung cpuflagnya.
Ada ratusan fungsi yang perlu diikat secara dinamis dengan cara ini, sehingga mengubah deklarasi atau kode pemanggilan tidaklah praktis. Tautan program cukup mudah diubah. Variabel lingkungan runtime juga dapat diubah, tetapi saya memilih untuk tidak mengubahnya.
Saya telah membuat executable yang membangun dan memulai dengan simbol eksternal yang belum terselesaikan (UES) melalui flag ld --unresolved-symbols=ignore-all
. Namun pemuatan lib impl selanjutnya tidak mengubah nilai fungsi UES dari NULL.