LINUX.ORG.RU

Сообщения Kito

 

вопрос по скриптам компоновщика для arm

Вот есть скрипт компоновщика:

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
MEMORY
{
    ROM  (rx) : ORIGIN = 0x08000000, LENGTH = 64K
    RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
}

SECTIONS
{
    .isr_vector ORIGIN(ROM) :
    {
        KEEP(*(.isr_vector))
    } >ROM
    
    .text ALIGN(4) :
    {
        *(.text*);
    } > ROM
    
    
    .common ORIGIN(RAM) (NOLOAD) :
    {
        *(COMMON)
    } >RAM
    
    .bss ALIGN(4) (NOLOAD): {
        PROVIDE(__bss_start__ = .);
        *(.bss*)
        PROVIDE(__bss_end__ = .);
    } > RAM
    
    .data ALIGN(4):
    {
        PROVIDE(__data_start__ = .);
        *(.data*)
        PROVIDE(__data_end__ = .);
    } > RAM AT>ROM
    
    PROVIDE(__data_lma__ = LOADADDR(.data));    
    PROVIDE(__stack_top__ = ORIGIN(RAM) + LENGTH(RAM));
}

из этого скрипта экспортируются переменные ,чтоб в оперативной памяти инициализовать переменные ,у которых есть изначальное значение в коде.

А вот часть кода , который использует эти переменные ,чтобы перенести значение из флеша в оперативу:

extern uint8_t __data_start__, __data_end__, __data_lma__, 
   __bss_start__, __bss_end__;
 
uint32_t *dst;
dst = &__bss_start__;
while (dst < &__bss_end__)
    *dst++ = 0;
dst = &__data_start__;
uint32_t *src = &__data_lma__;
while (dst < &__data_end__)
    *dst++ = *src++;

Как я понимаю, значение экспортируемых переменных - это адрес соответствующих участков памяти.

В строках 4, 5 объявляется указатель dst значение которого адрес переменной __bss_start__ . Вопрос: почему в цикле применяется одна операция разыменовавыния (*dst++), ведь таким образом мы получаем адрес который храниться в переменной __bss_start__, но дальше мы не обращаемся к памяти по этому адресу, а работаем с ним как с обычным числом. Почему здесь не (**dst++) ?

 , ,

Kito
()

перенаправление вывода bash в сокет

открыто 2 терминала: в 1 запущено nc -lvp 4444 во 2 я хочу подключиться к 1,чтоб получать с него команды и вывод направлять в 1 терминал, ввожу: nc 127.0.0.0 4444 | bash &> /dev/tcp/127.0.0.0/4444

соединение устанавливается, но вывода от запущенного bash’а не получаю ни в одном терминале.(команды он ,по всей видимости, выполняет). Как решение нашел такую комбинацию 0>&1 , она меня в ступор вгоняет, в man’е я прочел ,что такая комбинация ([n]>word), открывает файл word на запись из потока n, но ведь 0 ,в моем случае, это входной поток и получается этой комбинацией я делаю его выводом направленым туда же куда и &1 (в /dev/tcp… ?) вообщем подскажите ,где я неправильно думаю , и почему моя комбинация изначальная не работает так как я предполагал?

 ,

Kito
()

RSS подписка на новые темы