Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

211
Views
GCC -flto cambiando la visibilidad del símbolo

Tengo un gran fragmento de código que produce errores cuando se compila usando -flto solo en algunas versiones de gcc. Trataré de resumir a continuación

en archivo1.h

 extern char A [100];

en archivo1.c

 #include "file1.h" char A[100];

También tengo un código C++ que usa la variable A . El código C++ se compila en un archivo .o , y luego todo se compila con algo como

 gcc file1.c cpp.o

Usando la versión de gcc en archlinux (5.2.0), no hay problema con y sin -flto . Sin embargo, al usar gcc en Ubuntu 14.04 (4.8.4), cuando el código se compila con -flto , A se convierte en una variable local. He verificado esto con nm:

Estos son los resultados de nm a.out para la variable en cuestión

Ubuntu, no lto (arco similar, con un número diferente):

 00000000006162e0 BA

Ubuntu, lto

 00000000006092c0 b A.2722

Tengo entendido que la B es para una variable global y la b no lo es.

¿Cómo puedo asegurarme de que A se mantenga como una variable global incluso cuando uso -flto en Ubuntu?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Mirando esto y esto , ciertamente parece ser un error dentro de la versión particular de gcc que está utilizando (gcc 4.8.4 viene incluido con Ubuntu 14.04).

Usando los fragmentos de código de la pregunta,
Pude reproducir el comportamiento en mi máquina con Ubuntu 14.04.

Una solución simple para esto es marcar explícitamente el símbolo en cuestión como used .

file1.c tiene el char A[100];

file2.c tiene __attribute__((used)) char A[100];

 gcc file1.c -o file1-default.o nm file1-default.o | grep "A$" 0000000000601060 BA <-- symbol is a global. gcc file1.c -flto -o file1-flto.o nm file1-flto.o | grep "A$" 0000000000601060 b A.2385 <-- symbol updated to a local. gcc file2.c -flto -o file2.o nm file2.o | grep "A$" 0000000000601060 BA <-- symbol retained as global.
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!