С http://linux.die.net/man/1/ld:
- упаковка = символ
Используйте функцию-обертку для символа. Любая неопределенная ссылка на символ будет преобразована в «_ wrap symbol». Любая неопределенная ссылка на «_ real symbol» будет преобразована в символ.
Я думаю, что слово «неопределенный» может быть ключевым здесь. Ваш интересующий символ определенно определен в bar.o, и вывод nm
подтверждает это, так как неопределенные символы отмечены «U», а не «W».
Обновление:
Полагаю, поэтому невозможно обернуть функции шаблона?
Я думаю, это зависит больше от того, где функция определена (или создана), и доступно ли это определение для компоновщика. В вашем случае, если вы определили не шаблонную функцию в bar.cpp, где она используется, результат будет таким же. Даже если вы определили функцию в bar.cpp, но использовали ее в main.cpp, я думаю, что она будет такой же, хотя и не совсем уверенной (вы можете попробовать). И я уверен, что если вы связали bar.cpp и main.cpp в разные модули (совместно используемую библиотеку и исполняемый файл), то вы сможете обернуть функцию из bar.cpp, используемую в main.cpp, опять же, независимо от того, шаблон это или нет.
Обновление 2: я не был уверен, но Майк подтвердил экспериментом (см. Его собственный ответ и комментарии там), что перенос работает, если символ не определен в объектном файле, даже если этот объектный файл связан вместе с другим объектом файл, содержащий определение символа. Отлично!