Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

208
Visualizações
¿Por qué nmagic hace que mi aplicación se bloquee cuando uso vars globales?

Noté (lamentablemente de la manera más difícil) que -Wl,--nmagic también conocida como la opción del enlazador -n , hace que mi aplicación falle cuando uso variables globales. Leer la página del manual realmente no responde por qué. Lo estaba usando porque trajo mi binario de 14K a 1K (y menos de 1K si uso algunos comandos más). ¿Hay algo que pueda hacer para restaurar el comportamiento adecuado? Enhebreo un hilo local pero no puedo averiguar cómo configurar la memoria local del hilo. los compiladores de c dicen que FS no es un registro válido y mov fs, rax crea una instrucción no válida (o algo así)

Cosas que noté:

  • Si no asigno un valor, funciona (es por eso que tengo la declaración if).
  • Si lo hago const int test=6 funciona (tendrás que borrar el if)
  • Sin la opción nmagic funciona sin cambios

Fuente:

 //clang or gcc -static -Wl,--nmagic -nostdlib test.c typedef unsigned long long int size_t; typedef long long int ssize_t; typedef long long int int64_t; ssize_t my_write(int fd, const void *buf, size_t size) { register int64_t rax __asm__ ("rax") = 1; register int rdi __asm__ ("rdi") = fd; register const void *rsi __asm__ ("rsi") = buf; register size_t rdx __asm__ ("rdx") = size; __asm__ __volatile__ ( "syscall" : "+r" (rax) : "r" (rdi), "r" (rsi), "r" (rdx) : "cc", "rcx", "r11", "memory" ); return rax; } void my_exit(int exit_status) { register int64_t rax __asm__ ("rax") = 60; register int rdi __asm__ ("rdi") = exit_status; __asm__ __volatile__ ( "syscall" : "+r" (rax) : "r" (rdi) : "cc", "rcx", "r11", "memory" ); } int test=6; //if this isn't assigned it works fine int _start(){ if (test == 0) test=6; my_write(1, "Hello\n", test); my_exit(0); return 0; }

tamaño -A ./a.fuera

 section size addr .note.gnu.property 48 4194816 .note.gnu.build-id 36 4194864 .text 127 4198400 .rodata 7 4202496 .eh_frame 120 4202504 .data 4 4210688 .comment 18 0 Total 360
over 4 years ago · Santiago Trujillo
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda