Allow to build shared libraries (.so) instead of static ones (.a).
Signed-off-by: Intel
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();
}
#
CONFIG_RTE_FORCE_INTRINSICS=n
+#
+# Compile to share library
+#
+CONFIG_RTE_BUILD_SHARED_LIB=n
+
#
#
# Compile libc directory
DIRS-$(CONFIG_RTE_LIBRTE_KNI) += librte_kni
endif
+include $(RTE_SDK)/mk/rte.sharelib.mk
include $(RTE_SDK)/mk/rte.subdir.mk
{
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:
_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;
}
#
# 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
# 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
$(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
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.