Этот вопрос возник в контексте этого вопроса: Найти неиспользуемые строки кода С++
При поиске этой проблемы большинство людей пытались добавить код и переменные в один и тот же раздел, но это определенно не проблема. Вот минимальный рабочий пример:
unsigned cover() { return 0; }
#define COV() do { static unsigned cov[2] __attribute__((section("cov"))) = { __LINE__, cover() }; } while(0)
inline void foo() {
COV();
}
int main(int argc, char* argv[])
{
COV();
if (argc > 1)
COV();
if (argc > 2)
foo();
return 0;
}
который получается с помощью g++ -std=c++11 test.cpp
(g++ (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)) в следующей ошибке:
test.cpp:6:23: error: cov causes a section type conflict with cov
COV();
^
test.cpp:11:30: note: ‘cov’ was declared here
COV();
^
Ошибка не очень полезная, хотя, поскольку она не указывает, почему это должно быть конфликтом. Временные файлы .ii и .s не дают никакого намека на то, что может быть проблемой. На самом деле в файле .s
есть только одно определение раздела. .section cov,"aw",@progbits
и я не понимаю, почему следующее определение должно противоречить этому ( "aw", @progbits правильно...).
Есть ли способ получить дополнительную информацию об этом? Посмотрите, что именно конфликт есть? Или это просто ошибка...?