Как определить, какие объектные файлы на самом деле необходимы для соединения?

Я должен был изменить некоторый открытый исходный код для использования в проекте C. Вместо того, чтобы создать библиотеку из измененного кода, я хотел бы просто скомпилировать и создать исполняемый файл из моего собственного источника, объединенного с измененным открытым исходным кодом. Цель состоит в том, чтобы иметь автономный пакет, который может быть распределен. Я могу заставить это работать просто великолепно с помощью инструментов сборки GNU и успешно создал мой исполняемый файл.

Теперь я хотел бы срезать объем кода, который я создаю и связываю. Существует ли простой способ определить, какой из файлов с открытым исходным кодом я на самом деле должен скомпилировать? В пакете с открытым исходным кодом существует, скажем, 40.c файлов. Я предполагаю, что мой код только использует (или вызывает, чтобы использоваться), с 20 выходами из тех файлов. В настоящее время я компилирую всех их и бросаю все в компоновщика. Должно быть умное (и легкий?) способ определить, которые мне на самом деле нужно, правильно?

Я рад предоставить более подробную информацию, если это полезно.Заранее спасибо.

5
задан Joey 9 July 2010 в 01:29
поделиться

2 ответа

Столкнувшись с этим, я либо просто взял последнюю команду ссылки, вырезал все объекты и затем добавил обратно до тех пор, пока она не заработает, либо обработал вывод команды 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 в приведенном выше примере не используются.

3
ответ дан 14 December 2019 в 18:55
поделиться

Попробуйте заставить вашего стриппера мертвого кода сообщить вам, какие функции/символы он удалил во время соединения. Тогда вы будете знать, какой исходный код можно безопасно удалить. Опция -map компоновщика GNU может оказаться полезной в этом отношении. Можно, например, один раз скомпоновать без удаления мертвого кода, затем снова скомпоновать с удалением мертвого кода и сравнить выходные файлы карт.

Если исходных файлов всего 40, стоит ли такая оптимизация вашего времени?

2
ответ дан 14 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: