การอ้างอิงที่ไม่ได้กำหนดไปยัง sync_fetch_and_add_4

เมื่อใดก็ตามที่ฉันพยายามใช้ __sync_fetch_and_add กับ -m32 บนเครื่อง 64 บิต ฉันจะได้รับข้อผิดพลาดต่อไปนี้ ขณะคอมไพล์ได้ดีกับ 64 บิตปกติ ฉันใช้คอมไพเลอร์ gcc 4.1.2 ปัญหาอาจเกิดขึ้นที่นี่และวิธีแก้ไขคืออะไร

replication.cpp:(.text+0xb3b): undefined reference to `__sync_fetch_and_add_4'
replication.cpp:(.text+0xb82): undefined reference to `__sync_fetch_and_add_4'
replication.cpp:(.text+0xcc2): undefined reference to `__sync_fetch_and_add_4'
/tmp/cc7u9FLV.o: In function `potential_barrier_leader(unsigned int, pthread_barrier_t*)':
replication.cpp:(.text+0xd3f): undefined reference to `__sync_fetch_and_add_4'
replication.cpp:(.text+0xd54): undefined reference to `__sync_fetch_and_add_4'
/tmp/cc7u9FLV.o:replication.cpp:(.text+0xdb0): more undefined references to `__sync_fetch_and_add_4' follow
collect2: ld returned 1 exit status
make: *** [all] Error 1

person MetallicPriest    schedule 03.11.2011    source แหล่งที่มา


คำตอบ (3)


การใช้แฟล็ก -march=i486 ช่วยฉันได้

person MetallicPriest    schedule 03.11.2011
comment
ไม่ได้ช่วยฉันเมื่อทำการคอมไพล์ข้ามไปยัง ARM ด้วย toolchain ที่ฉันไม่สามารถสร้างใหม่ได้ 8( - person Victor Sergienko; 29.04.2016

ลองใช้คอมไพเลอร์ GCC ที่ใหม่กว่า (เช่น GCC 4.6) ฉันพยายามคอมไพล์ด้วย gcc -S -O3 -m32 -fverbose-asm sync-3.c ไฟล์ทดสอบ gcc/testsuite/gcc.c-torture/compile/sync-3.c และใช้งานได้ gcc ของฉัน (บน Debian/Sid/AMD64) คือคอมไพเลอร์ระบบ gcc 4.6.2

person Basile Starynkevitch    schedule 03.11.2011
comment
การใช้ gcc เวอร์ชันใหม่ไม่ใช่ตัวเลือกเนื่องจากฉันไม่มีสิทธิ์ของผู้ดูแลระบบในระบบที่ฉันกำลังดำเนินการอยู่ - person MetallicPriest; 03.11.2011
comment
คุณไม่จำเป็นต้องรูทเพื่อสร้างและติดตั้งคอมไพเลอร์รุ่นใหม่ คุณสามารถ ../gcc-4.6.2/configure ด้วย --prefix=$HOME/pub --program-suffix=-my4.6.2 ฯลฯ หลังการติดตั้ง ให้ใช้ผ่าน gcc-my4.6.2 โดยสมมติว่า $HOME/pub/bin อยู่ใน $PATH ของคุณ - person Basile Starynkevitch; 03.11.2011

ฮ่าฮ่า! มี "libs อะตอมมิกมาตรฐาน" 5+ ตัว (+ รองรับเคอร์เนล) ที่แทบจะไม่เป็นอะตอมไอซีถ้าคุณถามฉัน แต่เพิกเฉยต่อสิ่งนั้น ล้วนเป็นสิ่งรบกวนจิตใจทันเวลา

ดังนั้นอาคารของคุณเช่น glibc และได้รับข้อผิดพลาดนั้น (ฉันทำ)

glibc-2.11.x คาดว่า gcc-4.4.x จะกำหนดมันภายใน และคุณมี gcc sans bu ilt-in atomic เป็นไปได้ว่าคุณไม่ได้ระบุส่วนโค้งที่ gcc ยอมรับ (เนื่องจากขาดการดำเนินการที่เลวร้าย) glibc ชอบ 786, gcc ต้องการ 386 และอาจเป็น 786 ใช้ "native e" ควรทำ opt(march) และ opt(mtune) ไม่ใช่ทางเลือก gcc สร้างผิดโดยไม่มีพวกมัน (น่าจะ)

คุณจะไม่พบส่วนหัวหรือ libfoo ที่กำหนด (ต่อการพูด)

สำหรับ linux-gnu คุณอาจใช้ (แบบง่ายสำหรับ moi build)

cd gcc-4.4.foo
./configure --with-glibc-version=2.11 --enable-threads=posix \
--disable-cloog --disable-ppl --disable-libssp --enable-__cxa_atexit \
--disable-rpath --disable-nls --disable-bootstrp --disable-multilib \
--with-system-libunwind

สิ่งสำคัญ: หากคุณสร้าง gcc โดยไม่มี mtune ในเดือนมีนาคม gcc จะไม่กำหนด sync_fetch_and_add (ป.ล. glibc sync_fetch_and_add_4 เป็นเพียงมาโครสำหรับ sync_fetch_and_add ซึ่ง aga in glibc คาดว่าจะถูกกำหนดไว้)

นอกจากนี้หากคุณแทนที่ gcc-3.foo ด้วย gcc-4.4.foo และกำลังคอมไพล์คุณอาจต้องการ:

[ -n "$newgnu" ] && CFLAGS="$CFLAGS -march=native -mtune=native "
[ -n "$newgnu" ] && \
CFLAGS="$CFLAGS -std=gnu89 " && CPPFLAGS="$CPPFLAGS -std=gnu89 "

ฉันต้องการสิ่งนี้ใหม่ (newgnu) เพื่อสร้าง binutils-ver/: -Wstrict-aliasing=0

cd glibc-2.foo/
./configure  --with-headers=/usr/src/linux/usr/include \
--enable-kernel=2.2.foo \
--disable-profile --disable-sanity-checks --with-tls \
--disable-rpath --disable-nls
  • ขอบคุณผู้ชายในฮอลแลนด์ที่โพสต์ --std ซึ่งอาจเป็นปัญหาสำหรับผู้อัปเกรด gcc!

  • ไม่ต้องขอบคุณที่คณะกรรมการเปลี่ยนแปลงอย่างต่อเนื่องและสร้าง "มาตรฐาน" ที่สร้างปัญหาการขึ้นต่อกันใน gcc :( ใช้ .h หรือ .c อย่างเหมาะสมสำหรับ foo "builtin" เพื่อเพิ่มคุณสมบัติที่คุณต้องการในโค้ดของคุณเหมือนกับคนอื่น ๆ !!

มีความสุข :)

person toey knuwho    schedule 28.12.2014