[dpdk-dev] [PATCH 2/2] bpf: remove use of weak functions
Aaron Conole
aconole at redhat.com
Wed Apr 10 16:07:33 CEST 2019
Bruce Richardson <bruce.richardson at intel.com> writes:
> Weak functions don't work well with static libraries and require the use of
> "whole-archive" flag to ensure that the correct function is used when
> linking. Since the weak function is only used as a placeholder within this
> library alone, we can replace it with a non-weak version protected using
> preprocessor ifdefs.
>
> Signed-off-by: Bruce Richardson <bruce.richardson at intel.com>
> ---
I agree with dropping the weak implementations.
But, can't we adjust the order of objects when building with multiple
strong definitions and the linker will choose the first? I know this
works for the GNU linker.
I do find this information to help support this statement:
https://stackoverflow.com/questions/51656838/attribute-weak-and-static-libraries
Unfortunately, I don't find anything in the C standard to govern entity
precedence. This means it isn't something that works across linker
implementations (but compatible implementations like clang will maintain
that behavior).
> lib/librte_bpf/bpf_load.c | 4 +++-
> lib/librte_bpf/meson.build | 1 +
> 2 files changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/lib/librte_bpf/bpf_load.c b/lib/librte_bpf/bpf_load.c
> index d9d163b7d..194103ec7 100644
> --- a/lib/librte_bpf/bpf_load.c
> +++ b/lib/librte_bpf/bpf_load.c
> @@ -131,7 +131,8 @@ rte_bpf_load(const struct rte_bpf_prm *prm)
> return bpf;
> }
>
> -__rte_experimental __rte_weak struct rte_bpf *
> +#ifndef RTE_LIBRTE_BPF_ELF
> +__rte_experimental struct rte_bpf *
> rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname,
> const char *sname)
> {
> @@ -146,3 +147,4 @@ rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname,
> rte_errno = ENOTSUP;
> return NULL;
> }
> +#endif
> diff --git a/lib/librte_bpf/meson.build b/lib/librte_bpf/meson.build
> index 8a79878ff..11c1fb558 100644
> --- a/lib/librte_bpf/meson.build
> +++ b/lib/librte_bpf/meson.build
> @@ -20,6 +20,7 @@ deps += ['mbuf', 'net', 'ethdev']
>
> dep = dependency('libelf', required: false)
> if dep.found()
> + dpdk_conf.set('RTE_LIBRTE_BPF_ELF', 1)
> sources += files('bpf_load_elf.c')
> ext_deps += dep
> endif
More information about the dev
mailing list