LINUX.ORG.RU

Топологическая сортировка (man tsort) обнаруживает петли. А как приготовить исходный граф для неё - тебе виднее.

ABW ★★★★★
()
Ответ на: комментарий от invy

Построить по выводу objdump или nm. Я так делал для других целей. В Интернете ничего готового не нашлось? У меня конечно остался код на питоне, но я им формировал вход для graphviz. Т.е. надо как-то дорабатывать. Могу выложить, если с него толк какой-то будет.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Если уже есть готовый парсер вывода objdump и nm, то буду благодарен :) В интернетах в основном борьба с заголовочными файлами.

invy ★★★★★
() автор топика
Ответ на: комментарий от xaizek

Класс, спасибо за наработки!

«Портироврал» на пистон3, работает! Когда доработаю постараю не забыть поделиться :)

invy ★★★★★
() автор топика
Ответ на: комментарий от ABW

man tsort

А чё, так можно было что ли?

По теме.

$ cat deps.sh 
#!/bin/sh

for objs in "$@"
do
	nm --undefined-only --extern-only --print-file-name -fp "$objs" | awk '{print $1, $2}'
	nm --defined-only --extern-only --print-file-name -fp "$objs" | awk '{print $2, $1}'
done

Эксперимент:

$ cat a.c
int b();
int a() {
    return b();
}
$ cat b.c
int a();
int b() {
    return a();
}
$ cat c.c
int c() {
    return 0;
}
$ gcc -c a.c b.c c.c
$ sh deps.sh a.o b.o c.o | tsort -
c
c.o:
tsort: -: input contains a loop:
tsort: b
tsort: b.o:
tsort: a
tsort: a.o:
b
b.o:
a
a.o:
_GLOBAL_OFFSET_TABLE_

Вывод не очень красив, объяснять лень, но, думаю, понятен.

anonymous
()
Ответ на: комментарий от anonymous

О тоже класс, спасибо!

invy ★★★★★
() автор топика
Ответ на: комментарий от anonymous

$ cat deps.sh

For лишний, nm принимает список объектников

$ cat deps.sh 
#!/bin/sh
nm --undefined-only --extern-only --print-file-name -fp "$@" | awk '{print $1, $2}'
nm --defined-only --extern-only --print-file-name -fp "$@" | awk '{print $2, $1}'
anonymous
()
Ответ на: комментарий от anonymous

Анон, спасибо, циклы нашел.

invy ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Но есть одно но, так же находятся циклы между объектниками в рамках одной библиотеки, то есть надо фильтровать.

invy ★★★★★
() автор топика
Ответ на: комментарий от invy

Сам совсем не хочешь что-то делать?

Для вывода неопределеных символ для либы (нерабочий код, мог что-то напутать, перед тем как использовать читай маны, башизм)

comm -23 <(nm --undefined | awk '{print $2}'| sort) <(nm --defined | awk '{print $2}'| sort)

Придется вернуться к for, чтобы пометить символы именем либы

for lib
do
  undefined | awk "{print \"$lib:\", $1}"
  defined | awk "{print $1, \"$lib:\",}"
done
anonymous
()
Ответ на: комментарий от anonymous

Анон, не пойми неправильно. Лишь фидбек, так-то я уже очень благодарен за идеи и дальше бы доделал.

invy ★★★★★
() автор топика
Ответ на: комментарий от invy

фидбек

Для чего такой фидбек? Лучше фидбек чем-то ценным, хотя бы набросками кода, можно 5000 руб (в какой-нибудь детский приют).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.