AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 494844
Accepted
Richard Smith
Richard Smith
Asked: 2019-01-17 06:29:04 +0800 CST2019-01-17 06:29:04 +0800 CST 2019-01-17 06:29:04 +0800 CST

Incorporando dados binários em um executável usando ferramentas LLVM

  • 772

No passado, eu incorporei arquivos de recursos (imagens) em programas convertendo-os primeiro em .oarquivos usando o vinculador GNU. Por exemplo:

ld -r -b binary -o file.o file.svg

A partir do FreeBSD 12, o linker padrão mudou de GNU para LLVM. Embora o vinculador pareça entender as opções de linha de comando, isso resulta em um erro. Por exemplo:

ld -r -b binary -o file.o file.svg
ld: error: target emulation unknown: -m or at least one .o file required

Também tentei usar as opções de linha de comando da página de manual ld.lld(1) :

ld --relocatable --format=binary -o file.o file.svg
ld: error: target emulation unknown: -m or at least one .o file required

Estou usando a ferramenta correta? Preciso especificar um valor para a -mopção?

freebsd linker
  • 3 3 respostas
  • 1710 Views

3 respostas

  • Voted
  1. Best Answer
    Claus Andersen
    2019-01-17T08:12:21+08:002019-01-17T08:12:21+08:00

    Parece que você precisa adicionar -z noexecstack(Isso foi adicionado para binários ELF também no LLD 7.0.0 ). O padrão é ter uma região de pilha executável que seja vulnerável à exploração via memória de pilha . Sua imagem binária não possui uma pilha executável e acredito que seja por isso que ela falha. O erro o deixa confuso, pois solicita que você diga qual emulação de destino usar para sua pilha (que você não possui).

    David Herrmann fez todo o trabalho duro e encontrou uma solução multiplataforma que abrange:

    • GNU-ld
    • GNU-ouro
    • GNU-libtool
    • trabalhar com compilação cruzada
    • trabalhe com LLVM
    • não requer ferramentas externas não padronizadas

    A invocação mágica é então:

    $(LD) -r -o "src/mydata.bin.o" -z noexecstack --format=binary "src/mydata.bin"
    

    E na maioria das vezes você quer que esse segmento binário seja somente leitura:

    $(OBJCOPY) --rename-section .data=.rodata,alloc,load,readonly,data,contents "src/mydata.bin.o"
    

    ATUALIZAR:

    Não consegui testar pois meu sistema estava:

    $ uname -r
    11.2-STABLE
    $ ld -V
    GNU ld 2.17.50 [FreeBSD] 2007-07-03
      Supported emulations:
       elf_x86_64_fbsd
       elf_i386_fbsd
    

    Eu criei uma VM com o FreeBSD 12.0 para testar isso e descobri isso:

    $ uname -r
    12.0-RELEASE
    $ ld -V
    LLD 6.0.1 (FreeBSD 335540-1200005) (compatible with GNU linkers)
    

    O -z noexecstackfoi adicionado apenas na versão 7.0.0 e não está listado na página de manual da versão 6.0.1. Mais irritantemente, especificar valores não suportados para -znão acionar um erro!

    Eu não atualizei para o LLVM 7 para testar se isso funciona. @Richard Smith encontrou uma solução adequada especificando a emulação -mem outra resposta. Essa rota seria muito mais fácil se o LLD listasse emulações suportadas com -V.

    Se você usar o filecomando on file.o, verá que ele se identifica como SYSV ELF. Isso pode ser bom o suficiente para você. Mas se você quiser exatamente o mesmo que o sistema, use o elf_amd64_fbsdque é um alias para elf_x86_64_fbsd. Irritantemente ld -Vnão produz emulações suportadas com LLD como o GNU ld faz.

    $ file /bin/cat
    /bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 12.0 (1200086), FreeBSD-style, stripped
    $ ld -r -b binary -m elf_amd64 -o data.o data.bin
    $ file data.o
    data.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
    $ ld -r -b binary -m elf_amd64_fbsd -o data.o data.bin
    $ file data.o
    data.o: ELF 64-bit LSB relocatable, x86-64, version 1 (FreeBSD), not stripped
    

    elf_amd64_fbsdé um alias para elf_x86_64_fbsd(ver D7837 e D24356 ). Espero que o LLD adicione as emulações à -Vsaída.

    • 2
  2. Richard Smith
    2019-01-18T06:15:59+08:002019-01-18T06:15:59+08:00

    Depois de examinar a fonte, a emulação de destino correta para minha plataforma é elf_amd64 . Portanto, a conversão de binário para arquivo de objeto funciona usando:

    ld -r -b binary -m elf_amd64 -o file.o file.svg
    
    • 2
  3. Uncle Billy
    2019-01-17T20:05:37+08:002019-01-17T20:05:37+08:00

    Será que realmente vale a pena? Isso não era portátil em primeiro lugar.

    Você deve converter melhor seu .svg para um array de caracteres C; Exemplo:

    $ cat Makefile
    .SUFFIXES: .svg
    .svg.c:
            od -tx1 $< | sed 's/ /,0x/g;s/[^,]*//;1s/,/char $*[]={/;$$s/$$/};/' > $@
    
    $ make file.o
    od -tx1 file.svg | sed 's/ /,0x/g;s/[^,]*//;1s/,/char file[]={/;$s/$/};/' > file.c
    cc    -c -o file.o file.c
    rm file.c
    

    Claro, você pode definir o nome do array para algo diferente / mais robusto (por exemplo char $(subst /,_,$*)[] = ..., em vez de char $*[] = ...com GNU make). Além disso, você pode construir um conversor ad-hoc bin2cescrito em C em vez daquele horrível combo od+sed.

    • 1

relate perguntas

  • FreeBSD com duas interfaces de rede e domínios diferentes

  • Problemas do Freebsd 11.1 com falha no teste de avaliação do gnu m4

  • Freebsd setfacl

  • ps -vxa não classifica em relação à memória

  • FreeBSD's sh: funções de lista

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve