Add a new private utilities library consisting of various useful helpers normally hidden within libhugetlbfs. Extend the library local marker idiom to include a private utilities marker __pu_. When we build libhugetlbfs these are forced local when building libhugetlbfs_privutils these are the only routines exported. This makes it very hard for the two libraries to interfere with each other when both are linked to the same binary, which is particularly important when testing the library; we must test the real one.
Signed-off-by: Andy Whitcroft <[EMAIL PROTECTED]> --- Makefile | 31 ++++++++++++++++++++++++++----- init_privutils.c | 25 +++++++++++++++++++++++++ libhugetlbfs_internal.h | 7 ++++++- libhugetlbfs_privutils.h | 22 ++++++++++++++++++++++ privutils.lds | 6 ++++++ tests/Makefile | 2 +- tests/counters.c | 1 + tests/hugetests.h | 3 +++ tests/libtestutils.c | 1 + version.lds | 1 + 10 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 init_privutils.c create mode 100644 libhugetlbfs_privutils.h create mode 100644 privutils.lds diff --git a/Makefile b/Makefile index 2d5a120..1bb4589 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,8 @@ PREFIX = /usr/local EXEDIR = /bin LIBOBJS = hugeutils.o version.o init.o morecore.o debug.o alloc.o shm.o kernel-features.o -INSTALL_OBJ_LIBS = libhugetlbfs.so libhugetlbfs.a +LIBPUOBJS = init_privutils.o debug.o +INSTALL_OBJ_LIBS = libhugetlbfs.so libhugetlbfs.a libhugetlbfs_privutils.so BIN_OBJ_DIR=obj INSTALL_BIN = hugectl hugeedit hugeadm pagesize INSTALL_HEADERS = hugetlbfs.h @@ -20,7 +21,7 @@ NODEPTARGETS=<version.h> <clean> INSTALL = install -LDFLAGS += --no-undefined-version -Wl,--version-script=version.lds -ldl +LDFLAGS += --no-undefined-version -ldl CFLAGS ?= -O2 -g CFLAGS += -Wall -fPIC CPPFLAGS += -D__LIBHUGETLBFS__ @@ -154,7 +155,7 @@ all: libs tests tools .PHONY: tests libs -libs: $(foreach file,$(INSTALL_OBJ_LIBS),$(OBJDIRS:%=%/$(file))) +libs: $(foreach file,$(INSTALL_OBJ_LIBS),$(OBJDIRS:%=%/$(file))) $(BIN_OBJ_DIR)/libhugetlbfs_privutils.a tests: libs # Force make to build the library first tests: tests/all @@ -227,11 +228,31 @@ obj64/libhugetlbfs.a: $(LIBOBJS64) obj32/libhugetlbfs.so: $(LIBOBJS32) @$(VECHO) LD32 "(shared)" $@ - $(CC32) $(LDFLAGS) -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS) + $(CC32) $(LDFLAGS) -Wl,--version-script=version.lds -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS) obj64/libhugetlbfs.so: $(LIBOBJS64) @$(VECHO) LD64 "(shared)" $@ - $(CC64) $(LDFLAGS) -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS) + $(CC64) $(LDFLAGS) -Wl,--version-script=version.lds -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS) + +#obj32/libhugetlbfs_privutils.a: $(LIBPUOBJS:%=obj32/%) +# @$(VECHO) AR32 $@ +# $(AR) $(ARFLAGS) $@ $^ +# +#obj64/libhugetlbfs_privutils.a: $(LIBPUOBJS:%=obj64/%) +# @$(VECHO) AR64 $@ +# $(AR) $(ARFLAGS) $@ $^ + +$(BIN_OBJ_DIR)/libhugetlbfs_privutils.a: $(LIBPUOBJS:%=$(BIN_OBJ_DIR)/%) + @$(VECHO) ARHOST $@ + $(AR) $(ARFLAGS) $@ $^ + +obj32/libhugetlbfs_privutils.so: $(LIBPUOBJS:%=obj32/%) + @$(VECHO) LD32 "(shared)" $@ + $(CC32) $(LDFLAGS) -Wl,--version-script=privutils.lds -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS) + +obj64/libhugetlbfs_privutils.so: $(LIBPUOBJS:%=obj64/%) + @$(VECHO) LD64 "(shared)" $@ + $(CC64) $(LDFLAGS) -Wl,--version-script=privutils.lds -Wl,-soname,$(notdir $@) -shared -o $@ $^ $(LDLIBS) obj32/%.i: %.c @$(VECHO) CPP $@ diff --git a/init_privutils.c b/init_privutils.c new file mode 100644 index 0000000..6c9243d --- /dev/null +++ b/init_privutils.c @@ -0,0 +1,25 @@ +/* + * libhugetlbfs - Easy use of Linux hugepages + * Copyright (C) 2008 Nishanth Aravamudan, IBM Corporation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libhugetlbfs_internal.h" + +static void __attribute__ ((constructor)) setup_libhugetlbfs(void) +{ + hugetlbfs_setup_debug(); +} diff --git a/libhugetlbfs_internal.h b/libhugetlbfs_internal.h index 4d7add7..4e20885 100644 --- a/libhugetlbfs_internal.h +++ b/libhugetlbfs_internal.h @@ -27,6 +27,8 @@ #error This header should not be included by library users. #endif /* __LIBHUGETLBFS__ */ +#include "libhugetlbfs_privutils.h" + #define stringify_1(x) #x #define stringify(x) stringify_1(x) @@ -45,7 +47,10 @@ * When adding a library local variable externalise the symbol as * normal, plus add a #define of the form below. This define effectively * renames the routine into the local namespace __lh_* which is forced - * local in the linker script version.lds. + * local in the linker script version.lds. Some routines may need to be + * exported in the utilities library these are marked __pu_* which marks + * them for export in libhugetlbfs_privutils; their definitions should + * appear in libhugetlbfs_privutils.h rather than here. */ extern int __hugetlbfs_verbose; extern int __hugetlbfs_debug; diff --git a/libhugetlbfs_privutils.h b/libhugetlbfs_privutils.h new file mode 100644 index 0000000..1a45ed0 --- /dev/null +++ b/libhugetlbfs_privutils.h @@ -0,0 +1,22 @@ +/* + * libhugetlbfs - Easy use of Linux hugepages + * Copyright (C) 2005-2006 David Gibson & Adam Litke, IBM Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef _LIBHUGETLBFS_PRIVUTILS_H +#define _LIBHUGETLBFS_PRIVUTILS_H + +#endif /* _LIBHUGETLBFS_PRIVUTILS_H */ diff --git a/privutils.lds b/privutils.lds new file mode 100644 index 0000000..5d481e2 --- /dev/null +++ b/privutils.lds @@ -0,0 +1,6 @@ +VERS_1.0 { + global: + __pu_*; + local: + *; +}; diff --git a/tests/Makefile b/tests/Makefile index e4e1ce2..f03ec68 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -22,7 +22,7 @@ BADTOOLCHAIN = bad-toolchain.sh CFLAGS = -O2 -Wall -g CPPFLAGS = -I.. -LDLIBS = -ldl -lpthread +LDLIBS = -ldl -lpthread -lhugetlbfs_privutils LDFLAGS32 = -L../obj32 LDFLAGS64 = -L../obj64 INSTALL = install diff --git a/tests/counters.c b/tests/counters.c index 522a00d..0284809 100644 --- a/tests/counters.c +++ b/tests/counters.c @@ -181,6 +181,7 @@ void _set_nr_hugepages(unsigned long count, int line) out: verify_counters(line, et, ef, er, es); } +#undef set_nr_hugepages #define set_nr_hugepages(c) _set_nr_hugepages(c, __LINE__) void _map(int s, int hpages, int flags, int line) diff --git a/tests/hugetests.h b/tests/hugetests.h index bb1146e..270923b 100644 --- a/tests/hugetests.h +++ b/tests/hugetests.h @@ -22,6 +22,9 @@ #include <errno.h> #include <string.h> + +#include "libhugetlbfs_privutils.h" + #define DEBUG /* Test return codes */ diff --git a/tests/libtestutils.c b/tests/libtestutils.c index 93388a9..4eeb880 100644 --- a/tests/libtestutils.c +++ b/tests/libtestutils.c @@ -37,6 +37,7 @@ #include <fcntl.h> #include "hugetlbfs.h" +#include "libhugetlbfs_privutils.h" #include "hugetests.h" void check_free_huge_pages(int nr_pages_needed) diff --git a/version.lds b/version.lds index f5c480a..ba06c82 100644 --- a/version.lds +++ b/version.lds @@ -6,6 +6,7 @@ VERS_1.0 { hugetlbfs_unlinked_fd; local: __lh_*; + __pu_*; }; HTLBFS_2.0 { -- 1.6.0.2.711.gf1ba4 ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Libhugetlbfs-devel mailing list Libhugetlbfs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel