Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
3555
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Организация памяти

529

И снова мы можем увидеть, как устроена секция .bss, вызвав инструмент objdump с конечным бинарным файлом.

# ~/STM32Toolchain/gcc-arm/bin/arm-none-eabi-objdump -h nucleo-f401RE.elf

nucleo-f401RE.elf:

file format elf32-littlearm

 

Sections:

 

 

 

 

 

Idx Name

Size

VMA

LMA

File off

Algn

0

.text

000000e8

08000000

08000000

00008000

2**2

 

 

CONTENTS, ALLOC, LOAD, READONLY, CODE

 

1

.data

00000004

20000000

080000e8

00010000

2**2

 

 

CONTENTS, ALLOC, LOAD, DATA

 

 

2

.bss

00000004

20000004

20000004

00010004

2**2

 

 

ALLOC

 

 

 

 

3

.comment

00000070

00000000

00000000

00010004

2**0

CONTENTS, READONLY

4 .ARM.attributes 00000033 00000000 00000000 00010074 2**0 CONTENTS, READONLY

Приведенный выше вывод консоли показывает, что секция имеет размер, равный 4 Байт, но она не занимает места в конечном бинарном файле, поскольку секция имеет только атрибут ALLOC.

20.2.2.1. Пара слов о секции COMMON

В предыдущем скрипте компоновщика мы использовали специальную директиву *(COMMON) при определении секции .bss. Она просто говорит компоновщику LD встроить содержимое общей секции (common section) в секцию .bss. Но что такое общая секция на самом деле? Чтобы лучше понять ее роль, нам нужно вспомнить некоторые малоизвестные особенности языка Си. Предположим, что у нас есть два файла с исходным кодом, и оба они определяют две глобальные инициализированные переменные с одинаковыми именами:

Файл A.c

int globalVar[3] = {0x1, 0x2, 0x3};

...

Файл B.c

int globalVar[3] = {0x1, 0x2, 0x3};

...

Если мы попытаемся сгенерировать конечное приложение, скомпоновав два перемещаемых файла (.o), то получим следующую ошибку:

B.o:(.data+0x0): multiple definition of 'globalVar' A.o:(.data+0x0): first defined here

collect2: error: ld returned 1 exit status