eal: fix automatic loading of drivers as shared libs
When checking the loading of EAL shared lib to see if we have a shared
DPDK build, we only want to include part of the ABI version in the check
rather than the whole thing. For example, with ABI version 21.1 for DPDK
release 21.02, the linker links the binary against librte_eal.so.21,
without the ".1".
To avoid any further brittleness in this area, we can check for multiple
versions when doing the check, since just about any version of EAL implies
a shared build. Therefore we check for presence of librte_eal.so with full
ABI_VERSION extension, and then repeatedly remove the end part of the
filename after the last dot, checking each time. For example (debug log
output for static build):
EAL: Checking presence of .so 'librte_eal.so.21.1'
EAL: Checking presence of .so 'librte_eal.so.21'
EAL: Checking presence of .so 'librte_eal.so'
EAL: Detected static linkage of DPDK
Fixes: 7781950f4d
("eal: fix shared lib mode detection")
Cc: stable@dpdk.org
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Tested-by: Sunil Pai G <sunil.pai.g@intel.com>
This commit is contained in:
parent
0d32fd0945
commit
9ff791eff6
@ -494,6 +494,39 @@ eal_dlopen(const char *pathname)
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
is_shared_build(void)
|
||||
{
|
||||
#define EAL_SO "librte_eal.so"
|
||||
char soname[32];
|
||||
size_t len, minlen = strlen(EAL_SO);
|
||||
|
||||
len = strlcpy(soname, EAL_SO"."ABI_VERSION, sizeof(soname));
|
||||
if (len > sizeof(soname)) {
|
||||
RTE_LOG(ERR, EAL, "Shared lib name too long in shared build check\n");
|
||||
len = sizeof(soname) - 1;
|
||||
}
|
||||
|
||||
while (len >= minlen) {
|
||||
/* check if we have this .so loaded, if so - shared build */
|
||||
RTE_LOG(DEBUG, EAL, "Checking presence of .so '%s'\n", soname);
|
||||
if (dlopen(soname, RTLD_LAZY | RTLD_NOLOAD) != NULL) {
|
||||
RTE_LOG(INFO, EAL, "Detected shared linkage of DPDK\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* remove any version numbers off the end to retry */
|
||||
while (len-- > 0)
|
||||
if (soname[len] == '.') {
|
||||
soname[len] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
RTE_LOG(INFO, EAL, "Detected static linkage of DPDK\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
eal_plugins_init(void)
|
||||
{
|
||||
@ -505,7 +538,7 @@ eal_plugins_init(void)
|
||||
* (Using dlopen with NOLOAD flag on EAL, will return NULL if the EAL
|
||||
* shared library is not already loaded i.e. it's statically linked.)
|
||||
*/
|
||||
if (dlopen("librte_eal.so."ABI_VERSION, RTLD_LAZY | RTLD_NOLOAD) != NULL &&
|
||||
if (is_shared_build() &&
|
||||
*default_solib_dir != '\0' &&
|
||||
stat(default_solib_dir, &sb) == 0 &&
|
||||
S_ISDIR(sb.st_mode))
|
||||
|
Loading…
Reference in New Issue
Block a user