
Below is a little program, made up of two files. It's a reduction of code causing filesystem crashes when compiled with g++ on some, but not all, platforms that gcc supports. It works fine with other compilers. The static version works fine, even with g++, and outputs "all's well that ends well". dll_test stackdumps at the line marked with the comment. Does anyone know what's going on here? Am I supposed to be passing some additional options to g++ when building or using shared libraries? Thanks, --Beman callee.cpp ========== #include <string> void f( std::string & s ) { s = "all's well that ends well"; // dll_test crash! } caller.cpp ========== #include <string> #include <iostream> void f( std::string & s ); int main() { std::string s; f(s); std::cout << s << std::endl; return 0; } Compile and test (cygwin) ========================= g++ -o static_test caller.cpp callee.cpp static_test g++ -c callee.cpp g++ -shared -o callee.dll callee.o g++ -o dll_test caller.cpp -L./ -lcallee dll_test

Beman Dawes wrote:
Compile and test (cygwin) =========================
g++ -o static_test caller.cpp callee.cpp static_test
g++ -c callee.cpp
You'd better off with: g++ -c -fPIC callee.cpp
g++ -shared -o callee.dll callee.o g++ -o dll_test caller.cpp -L./ -lcallee
This -L./ sounds strange. What's wrong with: -L. ? I don't think that either of those things should cause a backtrace, but everything is possible with cygwin. Does it work with mingw? - Volodya

Vladimir Prus wrote:
Beman Dawes wrote:
Compile and test (cygwin) =========================
g++ -o static_test caller.cpp callee.cpp static_test
g++ -c callee.cpp
You'd better off with:
g++ -c -fPIC callee.cpp
That produce a warning: -fPIC ignored for target (all code is position independent), and the test still crashes.
g++ -shared -o callee.dll callee.o g++ -o dll_test caller.cpp -L./ -lcallee
This -L./ sounds strange. What's wrong with:
-L.
Same crash. The same crash also occurs when I build with bjam.
?
I don't think that either of those things should cause a backtrace, but everything is possible with cygwin. Does it work with mingw?
The problem isn't just with cygwin. It happens with gcc on some non-Windows operating systems. I'll try to get some more specifics on that. --Beman

Beman Dawes wrote:
Does anyone know what's going on here? Am I supposed to be passing some additional options to g++ when building or using shared libraries?
Well, you may need to set LD_LIBRARY_PATH env. variable or equivalent, or link with -rpath. However, if callee.dll could not be found in runtime, I'd expect a message from loader instead of a crash. For example, on a Linux system: bash-3.00$ g++ -o dll_test caller.cpp -L. -lcallee bash-3.00$ dll_test dll_test: error while loading shared libraries: libcallee.so: cannot open shared object file: No such file or directory bash-3.00$ export LD_LIBRARY_PATH=. bash-3.00$ dll_test all's well that ends well bash-3.00$ export LD_LIBRARY_PATH= bash-3.00$ g++ -Wl,-rpath . -o dll_test caller.cpp -L. -lcallee bash-3.00$ dll_test all's well that ends well bash-3.00$ Anyway, I tried your example on HP-UX/ia64 with gcc 4.2.1 and it worked, both static and dll. Thanks, Boris ----- Original Message ----- From: "Beman Dawes" <bdawes@acm.org> To: "Boost mailing list" <boost@lists.boost.org> Sent: Friday, September 14, 2007 4:15 PM Subject: [boost] [gcc] bug causing filesystem crashes
Below is a little program, made up of two files. It's a reduction of code causing filesystem crashes when compiled with g++ on some, but not all, platforms that gcc supports. It works fine with other compilers.
The static version works fine, even with g++, and outputs "all's well that ends well".
dll_test stackdumps at the line marked with the comment.
Does anyone know what's going on here? Am I supposed to be passing some additional options to g++ when building or using shared libraries?
Thanks,
--Beman
callee.cpp ==========
#include <string>
void f( std::string & s ) { s = "all's well that ends well"; // dll_test crash! }
caller.cpp ==========
#include <string> #include <iostream>
void f( std::string & s );
int main() { std::string s; f(s); std::cout << s << std::endl; return 0; }
Compile and test (cygwin) =========================
g++ -o static_test caller.cpp callee.cpp static_test
g++ -c callee.cpp g++ -shared -o callee.dll callee.o g++ -o dll_test caller.cpp -L./ -lcallee dll_test _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
participants (3)
-
Beman Dawes
-
Boris Gubenko
-
Vladimir Prus