mk: shared libraries

Allow to build shared libraries (.so) instead of static ones (.a).

Signed-off-by: Intel
This commit is contained in:
Intel 2013-09-18 12:00:00 +02:00 committed by Thomas Monjalon
parent 6da94b7a92
commit e25e4d7ef1
8 changed files with 103 additions and 16 deletions

View File

@ -150,7 +150,15 @@ static void rdtsc_prof_init(struct rdtsc_prof *p, const char *name)
static inline void rdtsc_prof_start(struct rdtsc_prof *p)
{
#ifdef __PIC__
asm volatile (
"mov %%ebx, %%edi\n"
"cpuid\n"
"xchgl %%ebx, %%edi;\n"
: : : "%eax", "%edi", "%ecx", "%edx" );
#else
asm( "cpuid" : : : "%eax", "%ebx", "%ecx", "%edx" );
#endif
p->clk_start = rte_rdtsc();
}

View File

@ -73,6 +73,11 @@ CONFIG_RTE_TOOLCHAIN_GCC=y
#
CONFIG_RTE_FORCE_INTRINSICS=n
#
# Compile to share library
#
CONFIG_RTE_BUILD_SHARED_LIB=n
#
#
# Compile libc directory

View File

@ -54,4 +54,5 @@ ifeq ($(CONFIG_RTE_EXEC_ENV_LINUXAPP),y)
DIRS-$(CONFIG_RTE_LIBRTE_KNI) += librte_kni
endif
include $(RTE_SDK)/mk/rte.sharelib.mk
include $(RTE_SDK)/mk/rte.subdir.mk

View File

@ -190,17 +190,33 @@ rte_cpu_get_features(struct cpuid_parameters_t params)
{
int eax, ebx, ecx, edx; /* registers */
asm volatile ("cpuid"
/* output */
: "=a" (eax),
"=b" (ebx),
"=c" (ecx),
"=d" (edx)
/* input */
: "a" (params.eax),
"b" (params.ebx),
"c" (params.ecx),
"d" (params.edx));
#ifndef __PIC__
asm volatile ("cpuid"
/* output */
: "=a" (eax),
"=b" (ebx),
"=c" (ecx),
"=d" (edx)
/* input */
: "a" (params.eax),
"b" (params.ebx),
"c" (params.ecx),
"d" (params.edx));
#else
asm volatile (
"mov %%ebx, %%edi\n"
"cpuid\n"
"xchgl %%ebx, %%edi;\n"
: "=a" (eax),
"=D" (ebx),
"=c" (ecx),
"=d" (edx)
/* input */
: "a" (params.eax),
"D" (params.ebx),
"c" (params.ecx),
"d" (params.edx));
#endif
switch (params.return_register) {
case REG_EAX:

View File

@ -83,17 +83,33 @@ rte_atomic64_cmpset(volatile uint64_t *dst, uint64_t exp, uint64_t src)
_exp.u64 = exp;
_src.u64 = src;
#ifndef __PIC__
asm volatile (
MPLOCKED
"cmpxchg8b (%[dst]);"
"setz %[res];"
: [res] "=a" (res) /* result in eax */
: [dst] "S" (dst), /* esi */
"b" (_src.l32), /* ebx */
"c" (_src.h32), /* ecx */
"a" (_exp.l32), /* eax */
"d" (_exp.h32) /* edx */
: "memory" ); /* no-clobber list */
#else
asm volatile (
"mov %%ebx, %%edi\n"
MPLOCKED
"cmpxchg8b (%[dst]);"
"setz %[res];"
"xchgl %%ebx, %%edi;\n"
: [res] "=a" (res) /* result in eax */
: [dst] "S" (dst), /* esi */
"b" (_src.l32), /* ebx */
"D" (_src.l32), /* ebx */
"c" (_src.h32), /* ecx */
"a" (_exp.l32), /* eax */
"d" (_exp.h32) /* edx */
: "memory" ); /* no-clobber list */
#endif
return res;
}

View File

@ -39,12 +39,20 @@
#
# examples for RTE_EXEC_ENV: linuxapp, baremetal
#
ifeq ($(RTE_BUILD_SHARED_LIB),y)
EXECENV_CFLAGS = -pthread -fPIC
else
EXECENV_CFLAGS = -pthread
endif
EXECENV_LDFLAGS =
EXECENV_LDLIBS = -lrt -lm
EXECENV_ASFLAGS =
ifeq ($(RTE_BUILD_SHARED_LIB),y)
EXECENV_LDLIBS += -lgcc_s
endif
# force applications to link with gcc/icc instead of using ld
LINK_USING_CC := 1

View File

@ -38,6 +38,10 @@ include $(RTE_SDK)/mk/internal/rte.depdirs-pre.mk
# VPATH contains at least SRCDIR
VPATH += $(SRCDIR)
ifeq ($(RTE_BUILD_SHARED_LIB),y)
LIB := $(patsubst %.a,%.so,$(LIB))
endif
_BUILD = $(LIB)
_INSTALL = $(INSTALL-FILES-y) $(SYMLINK-FILES-y) $(RTE_OUTPUT)/lib/$(LIB)
_CLEAN = doclean
@ -64,25 +68,50 @@ O_TO_A_DO = @set -e; \
$(O_TO_A) && \
echo $(O_TO_A_CMD) > $(call exe2cmd,$(@))
O_TO_S = $(LD) $(CPU_LDFLAGS) -z muldefs -share $(OBJS-y) -o $(LIB)
O_TO_S_STR = $(subst ','\'',$(O_TO_S)) #'# fix syntax highlight
O_TO_S_DISP = $(if $(V),"$(O_TO_S_STR)"," LD $(@)")
O_TO_S_DO = @set -e; \
echo $(O_TO_S_DISP); \
$(O_TO_S) && \
echo $(O_TO_S_CMD) > $(call exe2cmd,$(@))
-include .$(LIB).cmd
#
# Archive objects in .a file if needed
#
ifeq ($(RTE_BUILD_SHARED_LIB),y)
$(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
@[ -d $(dir $@) ] || mkdir -p $(dir $@)
$(if $(D),\
@echo -n "$< -> $@ " ; \
echo -n "file_missing=$(call boolean,$(file_missing)) " ; \
echo -n "cmdline_changed=$(call boolean,$(call cmdline_changed,$(O_TO_A_STR))) " ; \
echo -n "cmdline_changed=$(call boolean,$(call cmdline_changed,$(O_TO_S_STR))) " ; \
echo -n "depfile_missing=$(call boolean,$(depfile_missing)) " ; \
echo "depfile_newer=$(call boolean,$(depfile_newer)) ")
$(if $(or \
$(file_missing),\
$(call cmdline_changed,$(O_TO_A_STR)),\
$(call cmdline_changed,$(O_TO_S_STR)),\
$(depfile_missing),\
$(depfile_newer)),\
$(O_TO_A_DO))
$(O_TO_S_DO))
else
$(LIB): $(OBJS-y) $(DEP_$(LIB)) FORCE
@[ -d $(dir $@) ] || mkdir -p $(dir $@)
$(if $(D),\
@echo -n "$< -> $@ " ; \
echo -n "file_missing=$(call boolean,$(file_missing)) " ; \
echo -n "cmdline_changed=$(call boolean,$(call cmdline_changed,$(O_TO_A_STR))) " ; \
echo -n "depfile_missing=$(call boolean,$(depfile_missing)) " ; \
echo "depfile_newer=$(call boolean,$(depfile_newer)) ")
$(if $(or \
$(file_missing),\
$(call cmdline_changed,$(O_TO_A_STR)),\
$(depfile_missing),\
$(depfile_newer)),\
$(O_TO_A_DO))
endif
#
# install lib in $(RTE_OUTPUT)/lib

View File

@ -63,6 +63,10 @@ ifneq ($(BUILDING_RTE_SDK),)
RTE_TOOLCHAIN := $(CONFIG_RTE_TOOLCHAIN:"%"=%)
RTE_TARGET := $(RTE_ARCH)-$(RTE_MACHINE)-$(RTE_EXEC_ENV)-$(RTE_TOOLCHAIN)
RTE_SDK_BIN := $(RTE_OUTPUT)
RTE_BUILD_SHARED_LIB := $(CONFIG_RTE_BUILD_SHARED_LIB:"%"=%)
ifeq ($(RTE_BUILD_SHARED_LIB),)
RTE_BUILD_SHARED_LIB := n
endif
endif
# RTE_TARGET is deducted from config when we are building the SDK.