[Cmake] command to build dynamic lib changed causing my VXL b uild to brea k
Wheeler, Fred (CRD)
wheeler at crd.ge.com
Sun Jan 13 10:01:07 EST 2002
Brad, Peter,
Thanks for your replies. Brad's idea that I might have a mixed batch of .o files is a good one, but
I guarded against that. I can demo the problem I am seeing with the commands below. I'm finding
some more strange behavior described in the comments that start with "!!!". Note that optimization
(whether -O2 is used or not) affects this, and that the problem only happens when I use both objects
in the demo below.
Brad noted that the compiler should know whether the object file it is creating will go in a shared
or non-shared library. Makes sense to me, but it looks to me like cmake started using "-shared
-nostdlib" for creating the shared lib, but did not change the command line for creating object
files. Right?
# demo
cd /tmp
VXLSRC=/no_backup/wheeler/prj/sr/vxl_src
# !!! the problem does not occur if either of these object files is removed from the library
# build vcl_ostream_iterator+int-.o
c++ -g -O2 -Wall -Dvcl_EXPORTS -fPIC -I$VXLSRC/vcl -I/no_backup/wheeler/prj/sr/vxl_bld/vcl
-I/no_backup/wheeler/prj/sr/vxl_bld/vxl -I$VXLSRC/vcl -DVXL_WARN_DEPRECATED
-DVXL_WARN_DEPRECATED_ONCE -c $VXLSRC/vcl/Templates/vcl_ostream_iterator+int-.cxx -o
vcl_ostream_iterator+int-.o
# build vcl_vector+bool-.o
# !!! if I remove the -O2 option - no bus error
c++ -g -O2 -Wall -Dvcl_EXPORTS -fPIC -I$VXLSRC/vcl -I/no_backup/wheeler/prj/sr/vxl_bld/vcl
-I/no_backup/wheeler/prj/sr/vxl_bld/vxl -I$VXLSRC/vcl -DVXL_WARN_DEPRECATED
-DVXL_WARN_DEPRECATED_ONCE -c $VXLSRC/vcl/Templates/vcl_vector+bool-.cxx -o vcl_vector+bool-.o
# a minimal main
cat<<EOF >| foo.cxx
int main() { return 0; }
EOF
c++ -g -O2 -c foo.cxx -o foo.o
# with this option there is no bus error
OPT="-Wl,-G"
# with this option the exec will produce a bus error
OPT="-shared -nostdlib"
# build vcl library with only two objects
c++ -v $OPT -g -O2 -o /tmp/libvcl.so \
vcl_ostream_iterator+int-.o \
vcl_vector+bool-.o
# link
c++ foo.o -L/tmp -lvcl -Wl,-R,/tmp: -o foo
# run, bus error will occur here is "-shared -nostdlib" was used
./foo
# if there was a bus error, gdb yeilds garbage (otherwise it works)
138% gdb foo
GNU gdb 5.1
(gdb) break main
Breakpoint 1 at 0x10700: file foo.cxx, line 1.
(gdb) run
Starting program: /tmp/foo
Program received signal SIGSEGV, Segmentation fault.
0xff3c9e84 in ?? ()
(gdb) where
#0 0xff3c9e84 in ?? ()
#1 0xff3c3bdc in ?? ()
#2 0xff3b2ea0 in ?? ()
#3 0xff3ba8cc in ?? ()
#4 0xff3c4da0 in ?? ()
#5 0xff3b2958 in ?? ()
(gdb)
Fred Wheeler
--
Fred Wheeler, GE CRD, KWC-303
Phone: 518-387-7225 (GE Internal Dialcom: 8*833-7225)
Fax: 518-387-4042 (GE Internal Dialcom: 8*833-4042)
-----Original Message-----
From: Brad King [mailto:brad.king at kitware.com]
Sent: Saturday, January 12, 2002 8:57 PM
To: Wheeler, Fred (CRD)
Cc: 'vxl-maintainers at lists.sourceforge.net'; 'cmake at public.kitware.com'
Subject: Re: [Cmake] command to build dynamic lib changed causing my VXL
build to brea k
Fred,
> Sometime over the past week or two CMake started producing makefiles
> that use the "-shared -nostdlib" options instead of "-Wl,-G" to link
> objects into a shared library (*.so). With this change all of VXL
> still builds for me, but just about all executables produced in the
> VXL tree stop with a Bus Error immediately after starting.
> Everything build fine, but nothing runs. Strange.
We recently switched the flags from -Wl,-G to -shared -nostdlib to solve
other problems. The -shared flag is the correct choice..."-Wl,-G" tells
the C++ compiler to pass the "-G" option to the linker, which tells it to
create a shared library. However, the C++ compiler then does not know
that the code it is generating is going into a shared library, so it
doesn't put in the correct static data initialization code (to call
constructors of static data, etc). The -shared option tells the compiler
to put in the proper init code, and automatically causes it to pass the -G
option on to the linker.
Have you done a complete re-build of VXL in a clean directory? Your
problems may be caused by some .o files or libraries being built with the
old flags, and some with the new.
-Brad
More information about the CMake
mailing list