OSX Snow Leopard: статические и динамические ссылки ведут себя по-разному - PullRequest
2 голосов
/ 16 ноября 2011

У меня есть некоторый код, структурированный так:

Исправлена ​​основная линия -> код пользователя -> зависимая библиотека

Эти три части могут быть статически связаны, и все в порядке.В качестве альтернативы, основная строка может быть превращена в исполняемый файл, а пользовательский код - в dylib, а основная строка загружает код пользователя с помощью dlopen () и вводит его с помощью dlsym ().

У меня есть сотни тестовых программ, гдеэто работает нормально, но в двух случаях, когда это не удается:

  • Случай 1: зависимой библиотекой является gmpxx (зависит от gmp).
  • Случай 2: зависимой библиотекой является SDL

В случае gmp динамическая программа печатает правильные ответы, а затем завершается с:

  flx_run(29601) malloc: *** error for object 0x7fff712ac500: pointer being freed was not allocated
  *** set a breakpoint in malloc_error_break to debug
  Abort trap

  (gdb) bt
  #0  0x00007fff8438e0b6 in __kill ()
  #1  0x00007fff8442e9f6 in abort ()
  #2  0x00007fff84346195 in free ()
  #3  0x00000001000d3a35 in flxusr::gmp__hyphen_0::_init_ ()
  Previous frame inner to this frame (gdb could not unwind past this frame)

Я предполагаю, что некоторое повреждение памяти здесь.

ВСлучай SDL:

  ~/felix>LD_LIBRARY_PATH=build/release/lib/rtl build/release/bin/flx_arun  demos/sdl/sdl-1.01.03-0.dylib
  frames in  seconds =  FPS
  frames in  seconds =  FPS
  frames in  seconds =  FPS

, тогда как

  ~/felix>demos/sdl/sdl-1.01.03-0
  98 frames in 5.016 seconds = 19.5375 FPS
  100 frames in 5.043 seconds = 19.8295 FPS
  82 frames in 5.043 seconds = 16.2602 FPS

Данные о частоте кадров форматируются как

   _urv20946  = ::flx::rtl::strutil::str(((double)PTF Frames  / seconds ));

, где

  template<class T>
  string str(T const &t) {
    std::ostringstream x;
    x << t;
    return x.str();
  }

с учетом этогоКод находится "в" зависимой библиотеке (ну, конечно, нет, он находится в заголовочном файле!)

Есть идеи?

...