2012-11-30 3 views
5

У меня есть программа для нескольких процессов, запущенная на MIPS-процессоре с uclibc, и она скомпилирована с gcc 4.5.3. Для одного из процессов (это имя «tv») требуется связать с одной общей библиотекой (libtest.so), которая также написана мной. Процесс «tv» написан на C++, а libtest.so находится в C.Как отлаживать загрузку разделяемой библиотеки

Я также сбрасываю заголовок эльфа из libtest.so, он имеет как флаг PIC, так и CPIC, поэтому я думаю, что создание библиотеки это нормально.

Когда я пытаюсь запустить программу, все процессы запускаются нормально, за исключением процесса «tv». Сообщение об ошибке отсутствует. Когда я использую ps, чтобы проверить его статус, он стал зомби-процессом.

Я попытался следующий

  1. Если удалить libtest.so из процесса связывания и удаления каких-либо ссылок на libtest.so, процесс «телевизор» может работать без какого-либо вопроса.

  2. Если я удалю любую ссылку на libtest.so, но сохраняйте libtest.so в процессе компоновки, процесс «tv» все еще не запускается.

  3. Я пытался использовать LD_DEBUG = all для отладки, но он не работает на моей плате, так как нет допустимого вывода.

Так что я думаю, что что-то пошло не так, когда я попытаюсь загрузить libtest.so, когда начинается процесс «tv». Но я не знаю, как отлаживать? Как мне узнать, вызывает ли какая-то часть libtest.so проблема?

Любое предложение приветствуется. Заранее спасибо.

+1

Вы попробовали 'strace'? – mattn

+2

Хм, очень интересный вопрос. У вас, похоже, огромное преимущество в том, что вы контролируете libtest, поэтому вы можете попытаться воспроизвести проблему с помощью простого процесса (не tv), а затем медленно вырезать все из libtest, пока проблема не исчезнет, ​​а затем повторно добавьте до тех пор, пока вы не сможете точно определить проблему (стиль бинарного поиска). Если проблема не будет воспроизводимой * только * с tv и немодифицированным libtest.so, и в этом случае удачи? – Cameron

+0

@mattn Я использовал strace и узнал, что получаю SIGBUS. Теперь я попытаюсь найти причину этого. Большое спасибо за предложение. – SSC

ответ

0

Убедитесь, что это не связано с отсутствием в декларации extern C для вашего API, которые должны вызываться как функции C.

+0

Я уверен, что это не из-за отсутствия внешней декларации «C», потому что компоновщик не будет ссылаться, поскольку имя функции будет изменено компилятором C++. – SSC

+0

Ваш libtest.so скомпилирован с компилятором C, поэтому имена функций не будут искажены.Мне интересно, когда при компиляции вашего ТВ-приложения, как будет работать компилятор C++, если ваш файл заголовка, экспортирующий API libtest.so, не имеет объявления extern «C». [Ссылка] (http://dsc.sun.com/solaris/articles/mixing.html#c_from_cpp) –

0

У вас возникла ошибка в процессе загрузки. Поэтому напишите простейшее приложение, которое загружает вашу библиотеку и немедленно выгружает ее и отлаживает ее.

Смежные вопросы