Using lex in a shared library

Matthew Fleming mdf356 at gmail.com
Fri Jul 2 21:51:17 UTC 2010


I have the following Makefile for a shared library at $work:

ISI_TOP=	../..

LIB=		isi_date
SHLIB_MAJOR=	1
SHLIB_MINOR=	0
SRCS=		date.c date_parser.new.c lex.yy.c
INCS=		date.h
INCLUDEDIR=	/usr/include/isi_date

YFLAGS+=	-vt
FLEX=		/usr/bin/flex
LDADD=		-ll

CLEANFILES+=	date_parser.new.c y.tab.h y.tab.c lex.yy.c y.output \
		check_date.log test

lex.yy.c: date_lexer.new.l
	${FLEX} $>

CFLAGS+=	-I${.CURDIR}
#CFLAGS+=	-g

.include "${ISI_TOP}/isi.lib.mk"



This builds fine as on i386.  I'm trying to get all our user-space to
be 64-bit clean, and I run into an error when building on amd64:

/data/sb/BR_MDF_64CLEAN/obj/data/sb/BR_MDF_64CLEAN/src/tmp/usr/bin/ld:
/data/sb/BR_MDF_64CLEAN/obj/data/sb/BR_MDF_64CLEAN/src/tmp/usr/lib/libl.a(libyywrap.o):
relocation R_X86_64_32 can not be used when making a shared object;
recompile with -fPIC
/data/sb/BR_MDF_64CLEAN/obj/data/sb/BR_MDF_64CLEAN/src/tmp/usr/lib/libl.a:
could not read symbols: Bad value

The following diff makes the compile work, but I have no idea (yet)
whether this will run, if it's the right solution, etc.


Index: usr.bin/lex/lib/Makefile
===================================================================
--- usr.bin/lex/lib/Makefile    (revision 153343)
+++ usr.bin/lex/lib/Makefile    (working copy)
@@ -4,11 +4,16 @@

 LIB=    ln
 SRCS=   libmain.c libyywrap.c
-NO_PIC=
+#NO_PIC=

+SHLIB_MAJOR=   1
+SHLIB_MINOR=   0
+
 .if ${MK_INSTALLLIB} != "no"
 LINKS=  ${LIBDIR}/libln.a ${LIBDIR}/libl.a
 LINKS+=        ${LIBDIR}/libln.a ${LIBDIR}/libfl.a
+LINKS+=        ${LIBDIR}/libln.so ${LIBDIR}/libl.so
+LINKS+=        ${LIBDIR}/libln${LIB_SUFFIX}.so ${LIBDIR}/libl${LIB_SUFFIX}.so
 .endif

 .if ${MK_PROFILE} != "no"


Thanks,
matthew


More information about the freebsd-hackers mailing list