- вопрос про linker, Hordi, 19:17 , 21-Май-07 (1)
Как через линковщик не знаю, но мож и objcopy хватит?
- вопрос про linker, matracc, 13:13 , 22-Май-07 (2)
>Как через линковщик не знаю, но мож и objcopy хватит? Спасибо, посмотрел в его сторону. Только решение пока в голову не пришло, но появился свет в дальнем конце. Нужно некоторый двоичный файл расположить в нужном месте программы, чтобы потом можно было до него добраться программно. Т.е. теперь проблема в том, что двоичный файл не есть объектный. Буду думать как из него сделать объектный... Но может все таки кто-нибудь добивался нужного эффекта более простыми путями?
- вопрос про linker, vic, 13:52 , 22-Май-07 (3)
>>Как через линковщик не знаю, но мож и objcopy хватит? > >Спасибо, посмотрел в его сторону. >Только решение пока в голову не пришло, но появился свет в дальнем >конце. Нужно некоторый двоичный файл расположить в нужном месте программы, чтобы >потом можно было до него добраться программно. Т.е. теперь проблема в >том, что двоичный файл не есть объектный. Буду думать как из >него сделать объектный... >Но может все таки кто-нибудь добивался нужного эффекта более простыми путями? дописать в конец + дописать в конец смещение :)
- вопрос про linker, Niam, 16:27 , 22-Май-07 (4)
>>>Как через линковщик не знаю, но мож и objcopy хватит? >> >>Спасибо, посмотрел в его сторону. >>Только решение пока в голову не пришло, но появился свет в дальнем >>конце. Нужно некоторый двоичный файл расположить в нужном месте программы, чтобы >>потом можно было до него добраться программно. Т.е. теперь проблема в >>том, что двоичный файл не есть объектный. Буду думать как из >>него сделать объектный... >>Но может все таки кто-нибудь добивался нужного эффекта более простыми путями? > >дописать в конец + дописать в конец смещение :) Дописать в конец + и знать размер обьекта. Вычислить смещение - отнять размер бинарника от объекта.
- вопрос про linker, Hordi, 18:20 , 22-Май-07 (5)
путей много, но правильный - это юзать elf-формат.Вот неупорядоченный кусок кода, который разгребает файл по секциям, а затем позволяет прочитать содержимое заданной секции. struct CElf::sData{ Elf32_Ehdr m_elf; std::map<std::string,Elf32_Shdr> m_mpSections; std::ifstream m_fElf; }; struct CElf::sData{ Elf32_Ehdr m_elf; std::map<std::string,Elf32_Shdr> m_mpSections; std::ifstream m_fElf; };
CElf::CElf(const char *szFileName) { m_pData = new sData(); m_pData->m_fElf.open(szFileName); if(m_pData->m_fElf){ m_pData->m_fElf.read(reinterpret_cast<char*>(&m_pData->m_elf), sizeof(m_pData->m_elf)); // load the header struct std::vector<Elf32_Shdr> vv(m_pData->m_elf.e_shnum); m_pData->m_fElf.seekg(m_pData->m_elf.e_shoff); m_pData->m_fElf.read(reinterpret_cast<char*>(&vv[0]), vv.size() * m_pData->m_elf.e_shentsize); // read in the section string table m_pData->m_fElf.seekg(vv[m_pData->m_elf.e_shstrndx].sh_offset); std::vector<char> vvs(vv[m_pData->m_elf.e_shstrndx].sh_size); m_pData->m_fElf.read(&vvs[0], vvs.size()); // now generate a map of names to sections for(unsigned i=0;i<vv.size();++i){ //TR2(i,std::string( (const char*)(&vvs[0] + vv[i].sh_name))); m_pData->m_mpSections[ std::string( (const char*)(&vvs[0] + vv[i].sh_name)) ] = vv[i]; } } } std::vector<unsigned char> CElf::getSection(const char *szSectionName) { std::vector<unsigned char> ret; // try to find the section std::map<std::string,Elf32_Shdr>::const_iterator itSec = m_pData->m_mpSections.find(szSectionName); // if we found the section if(itSec != m_pData->m_mpSections.end()){ m_pData->m_fElf.seekg(itSec->second.sh_offset); ret.resize(itSec->second.sh_size); m_pData->m_fElf.read(reinterpret_cast<char*>(&ret[0]), ret.size()); } return ret; }
- вопрос про linker, matracc, 18:35 , 22-Май-07 (6)
Ух ты... Большое спасибо за такое участие, но вопрос изначально был про использование стандартных средств. Дописать в конец, конечно можно, но это совсем негибко, поэтому рассматриволось как крайняя мера. А про секции и elf - раскрою секрет)) - дело в том, что целевая платформа совсем не pc. Я пишу программу для avr, соответственно использую кросскомпилятор avr-gcc и все, что в комплекте с ним, но пишу все это под виндой. И хочу получить не совсем бинарник, а hex файл в интеловском формате. Наверное придется написать для этого маленькую програмку, прилепить ее в местный bin и пускать из Makefile
- вопрос про linker, int_0d, 19:19 , 22-Май-07 (7)
>Ух ты... >Большое спасибо за такое участие, но вопрос изначально был про использование стандартных >средств. Дописать в конец, конечно можно, но это совсем негибко, поэтому >рассматриволось как крайняя мера. А про секции и elf - раскрою >секрет)) - дело в том, что целевая платформа совсем не pc. >Я пишу программу для avr, соответственно использую кросскомпилятор avr-gcc и все, >что в комплекте с ним, но пишу все это под виндой. >И хочу получить не совсем бинарник, а hex файл в интеловском >формате. >Наверное придется написать для этого маленькую програмку, прилепить ее в местный bin >и пускать из Makefile делаешь обьектник следующим образом: //some object_file_with_data_included.o .globl __some_very_stuffy_data .incbin "твой файл бинарник" после чего линкуешь его к программе и тебе из программы доступен символ __some_very_stuffy_data (удобно его расматривать как char []). При желании можно его запихнуть в отдельную секцию.
- вопрос про linker, matracc, 16:18 , 23-Май-07 (8)
Спасибо! Вроде помогло. Только как char[] к нему не обратишься, он же в памяти программ - гарвардская архитектура...
- вопрос про linker, int_0dh, 23:31 , 28-Май-07 (9)
>Спасибо! >Вроде помогло. Только как char[] к нему не обратишься, он же в >памяти программ - гарвардская архитектура... а что мешает запихать его в отдельную секцию, которую затем отмапить на память данных ? :)
- вопрос про linker, f00l, 13:36 , 08-Июн-07 (10)
>Подскажите пожалуйста, как сказать линковщику от gcc, чтобы он засовывал некоторый файл >в бинарник в сегмент данных или кода по указаному смещению. >Заранее спасибо! сделать x.lds файл и с линковать ld -T x.lds $(OBJS) $@ расположит все секции по указаным адресам !!! можно проше в опции -T указать конкретное расположение секции по адресу ld -Ttext 0x1000 -Tdata 0x2000
|