On Fri, 2008-10-17 at 17:14 +0100, Andy Whitcroft wrote: > 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]> Acked-by: Adam Litke <[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 { -- Adam Litke - (agl at us.ibm.com) IBM Linux Technology Center ------------------------------------------------------------------------- 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