Не верю! :-) У тебя перед PROVIDE( __global_pointer$ = . + 0x800 ); проставлено *(.data .data.*) - неужели у тебя .data пустая? Ну - допустим что так (все твои переменные инициализированы нулем и попадают в .bss)
Но тогда как получилось что твой tick_count расположен по адресу 0x20000000 ??? т.е. он ДОЛЖЕН находиться в секции .data
А если так, то... __global_pointer$ у тебя НИКАК не может быть = 0x20000800 !!!
В общем, как в анекдоте - какая-то черепашка пи%&дит :-)
Одно из 2-х - либо ты приводишь строку из .map-файле из другого проекта, либо .ld не из того проекта. Такое случается :-)
Желательно привести весь .ld-файл, но и без него видно, что ты привел выдержки откуда-то не от туда. Логическое несоответствие налицо