Я должен был изменить некоторый открытый исходный код для использования в проекте C. Вместо того, чтобы создать библиотеку из измененного кода, я хотел бы просто скомпилировать и создать исполняемый файл из моего собственного источника, объединенного с измененным открытым исходным кодом. Цель состоит в том, чтобы иметь автономный пакет, который может быть распределен. Я могу заставить это работать просто великолепно с помощью инструментов сборки GNU и успешно создал мой исполняемый файл.
Теперь я хотел бы срезать объем кода, который я создаю и связываю. Существует ли простой способ определить, какой из файлов с открытым исходным кодом я на самом деле должен скомпилировать? В пакете с открытым исходным кодом существует, скажем, 40.c файлов. Я предполагаю, что мой код только использует (или вызывает, чтобы использоваться), с 20 выходами из тех файлов. В настоящее время я компилирую всех их и бросаю все в компоновщика. Должно быть умное (и легкий?) способ определить, которые мне на самом деле нужно, правильно?
Я рад предоставить более подробную информацию, если это полезно.Заранее спасибо.
Столкнувшись с этим, я либо просто взял последнюю команду ссылки, вырезал все объекты и затем добавил обратно до тех пор, пока она не заработает, либо обработал вывод команды nm.
Просмотр вывода nm:
$ nm *.o
a.o:
00000000 T a
U aa
b.o:
00000000 T b
t.o:
U a
U b
00000000 T main
ua.o:
00000000 T ua
ub.o:
00000000 T ub
Итак, я создаю следующий сценарий awk
# find-unused.awk
BEGIN {req["main"]="crt"}
/\.o\:$/{
gsub(/\:/,"");
modulename=$0;
}
$1=="U"{
req[$2] = modulename;
}
/[0-9,a-f].* T/{
def[$3] = modulename;
}
END{
print "modules referenced:"
for (i in req)
{
if (def[i] != "")
print " "def[i];
}
print "functions not found"
for (i in req)
{
if (def[i] == "")
print " "i;
}
}
и затем вызываю его так:
$ nm *.o|awk -f find-unused.awk
он говорит мне:
modules referenced:
t.o
a.o
b.o
functions not found
aa
Что правильно - потому что функции ua и ub в приведенном выше примере не используются.
Попробуйте заставить вашего стриппера мертвого кода сообщить вам, какие функции/символы он удалил во время соединения. Тогда вы будете знать, какой исходный код можно безопасно удалить. Опция -map
компоновщика GNU может оказаться полезной в этом отношении. Можно, например, один раз скомпоновать без удаления мертвого кода, затем снова скомпоновать с удалением мертвого кода и сравнить выходные файлы карт.
Если исходных файлов всего 40, стоит ли такая оптимизация вашего времени?