ไบนารีขัดข้องเมื่อสร้างด้วย PPC

ฉันกำลังพัฒนาโปรแกรมสำหรับบอร์ดบางรุ่นซึ่งใช้ PowerPC Architechture ฉันเพิ่งทำการเปลี่ยนแปลงบางอย่างกับพื้นที่เก็บข้อมูล ปรับโครงสร้างใหม่เล็กน้อย จากนั้นย้ายและลบคลาส

บนเครื่องพัฒนาของฉัน (VM linux x64) ไบนารีสร้างได้ดีและสามารถเรียกใช้งานได้ เมื่อฉันสร้างด้วย CorssCompile Toolchain มันจะทำงานได้อย่างราบรื่นโดยไม่มีข้อผิดพลาดหรือคำเตือนใดๆ แต่ในระบบเป้าหมาย ฉันไม่สามารถให้โปรแกรมทำงานได้ ดูเหมือนว่าจะไปไม่ถึงจุดเข้าหลักด้วยซ้ำ

ฉันเดาว่าฉันได้สร้างปัญหาการเชื่อมโยงในโครงการขึ้นมา ฉันแค่ไม่รู้ว่าจะแก้ให้หายยุ่งกับสัตว์ร้ายนั้นได้อย่างไร

ดังนั้นคำถามของฉัน ฉันจะทราบข้อผิดพลาดที่เกิดขึ้นก่อนที่จะถึงจุดเข้าหลักได้อย่างไร ฉันจะค้นหาการพึ่งพาแบบวงกลมที่เป็นไปได้ที่มีอยู่ได้อย่างไร

และเพื่อ "ความสนุก" เท่านั้น: ทำไมในชื่อเทพถึงสร้างและรันบน x86 แต่ไม่ใช่บน ppc

ใช่ ฉันรู้ว่านี่เป็นข้อมูลเพียงเล็กน้อยที่ช่วยได้จริงๆ แต่ฉันกำลังขอคำแนะนำ เนื่องจากฉันจะต้องจัดการกับปัญหาเหล่านี้ในบางครั้ง


person MDeero    schedule 05.07.2016    source แหล่งที่มา
comment
ดูเหมือนว่า PPC toolchain หรือคอมไพเลอร์ของมันไม่ทราบวิธีจัดการตัวแปรคงที่ที่ถูกประกาศหลังการใช้งาน (ในคลาสเดียวกัน) ในขณะที่คอมไพเลอร์ x86 ไม่มีปัญหาในการแยกวิเคราะห์อินพุตดังกล่าว (เวอร์ชันของคอมไพเลอร์ที่แตกต่างกัน PPC นี้คือ v4.0.X ในขณะที่ x86 อยู่ที่ 5.X.X)   -  person MDeero    schedule 06.07.2016
comment
หากต้องการค้นหาข้อผิดพลาดที่ฉันทำ: On Target: gdb crashing/app แล้วดูที่เฟรม บางแห่งมี __static_initialization_and_destruction_0 เฟรม ซึ่งควรชี้คุณไปที่ไฟล์และบรรทัดตัวแปรคงที่ที่ยังไม่ได้ประกาศไว้ ถูกนำมาใช้ ดัมพ์หลักไม่มีประโยชน์ในสถานการณ์นี้ เนื่องจากดัมพ์ไม่สามารถเข้าถึงตัวแปรพีซีได้ มันจะไม่แสดงข้อมูลใด ๆ ให้คุณเห็นเลย (ดูเหมือนว่าบางทีฉันอาจใช้ gdb ผิด (ไม่ทั้งหมด)   -  person MDeero    schedule 06.07.2016


คำตอบ (1)


เหตุใดในนามพระเจ้าจึงสร้างและรันบน x86 แต่ไม่ใช่บน ppc

มีสาเหตุที่เป็นไปได้นับล้านสาเหตุ ตั้งแต่ cross-toolchain ที่เสียหาย ไปจนถึงจุดบกพร่องใน libc ไปจนถึงการเรียกใช้ toolchain ที่ไม่ถูกต้อง

ฉันกำลังขอเส้นทาง

คุณควรเริ่มต้นด้วยการรวบรวมแหล่งข้อมูลนี้:

int main() { return 0; }

และตรวจสอบว่าใช้งานได้ (ซึ่งเป็นการตรวจสอบความสมบูรณ์ของ toolchain พื้นฐาน) ถ้าเป็นเช่นนั้น คุณก็ขยายมันเพื่อพิมพ์บางอย่าง จากนั้นคอมไพล์ด้วยแฟล็กที่คุณใช้ในโครงการจริงของคุณ

หากทุกอย่างเรียบร้อยดี คุณสามารถรันโปรเจ็กต์จริงภายใต้ strace และ/หรือ GDB และดูว่าคุณเข้าใจหรือไม่ว่าความผิดพลาดเกิดขึ้นที่ใด ถ้าคุณไม่ทำ ให้แก้ไขคำถามของคุณด้วยผลลัพธ์จากเครื่องมือ แล้วบางคนอาจจะเดาได้ดีกว่า

อัปเดต:

ดูเหมือนว่า PPC toolchain หรือคอมไพเลอร์ของมันไม่ทราบวิธีจัดการตัวแปรคงที่ที่ถูกประกาศหลังการใช้งาน

หากเป็นเช่นนั้น คุณจะได้รับข้อผิดพลาดในการคอมไพล์ คุณไม่ได้ทำ ดังนั้นนี่จึงเป็นเท็จ

ตามเป้าหมาย: "gdb หยุดทำงาน/แอป" จากนั้นดูที่เฟรม บางแห่งมีเฟรม "__static_initialization_and_destruction_0" ซึ่งควรจะชี้ให้คุณไปที่ไฟล์และบรรทัดที่ใช้ตัวแปรคงที่ที่ยังไม่ได้ประกาศ

ปัญหาจริงของคุณน่าจะเป็นไปได้มาก: ลำดับการสร้างตัวแปรโกลบอล (หรือคลาสสแตติก) ในหน่วยการแปลที่แตกต่างกัน (เช่น ไฟล์ต้นฉบับที่แตกต่างกัน) ไม่ได้ถูกกำหนดไว้ (และโดยปกติจะตรงกันข้ามระหว่าง x86_64 และ ppc) หากคุณมี globals สองไฟล์ในไฟล์ที่แตกต่างกัน (เช่น A และ B) และหาก Constructor ของ Bs ขึ้นอยู่กับ A ที่สร้างไว้แล้ว โปรแกรมของคุณจะทำงานได้ดีบนแพลตฟอร์มที่ A ถูกสร้างขึ้นก่อน B แต่จะเสียหายบนแพลตฟอร์มที่ B พยายามที่จะสร้างก่อน A

person Employed Russian    schedule 05.07.2016
comment
สิ่งนี้ชี้ไปในทิศทางที่ถูกต้อง มีการอธิบายเล็กน้อยว่าจะทำอย่างไรดี อย่างไรก็ตาม ปัญหาที่แท้จริงได้อธิบายไว้ในความคิดเห็นในคำถามของฉัน - person MDeero; 06.07.2016
comment
@MDeero ฉันได้อัปเดตคำตอบแล้ว Re: อธิบายเล็กน้อย - คุณไม่ได้ให้ข้อมูลใด ๆ เพื่อทราบว่าจะเริ่มอธิบายอะไรได้จากที่ไหน - person Employed Russian; 06.07.2016
comment
อย่างจริงจัง มันเป็นอย่างที่ฉันอธิบายไว้! คุณไม่สามารถแก้ไขฉันในสิ่งที่ฉันเพิ่งเห็นได้ สิ่งเดียวที่ฉันทำเพื่อกำจัดข้อผิดพลาดคือย้ายบรรทัดของการประกาศตัวแปรคงที่ขึ้นก่อนที่จะใช้งาน (ในการประกาศตัวแปรคงที่อื่น) ในไฟล์ต้นฉบับเดียวกัน . และใช่ ฉันก็ถูกหลอกเหมือนกับคุณเลย ฉันคาดว่ามันจะทำให้เกิดข้อผิดพลาดในการคอมไพล์ แต่ก็ไม่ได้เป็นเช่นนั้น แต่กลับไม่ทำงาน (ฉันสามารถกำจัดข้อผิดพลาดได้ด้วยการอัปเดตคอมไพเลอร์ฉันเดา แต่เนื่องจากเป็นการคอมไพล์ข้าม ฉันจึงไม่อยากยุ่งกับสิ่งใดที่นั่น) - person MDeero; 06.07.2016
comment
@MDeero คุณอาจยังเข้าใจผิด การย้ายการประกาศขึ้น ยัง จะเปลี่ยนลำดับการก่อสร้างเมื่อเทียบกับตัวแปรอื่นๆ ที่ประกาศในไฟล์เดียวกัน ไม่ว่าในกรณีใด คำอธิบายของคุณไม่สมเหตุสมผล ดังนั้นจึงไม่น่าจะถูกต้องเลย - person Employed Russian; 06.07.2016
comment
ซีเมคเวอร์ชัน 3.2.2; GNU ทำ 3.81; CROSS_COMPILE: powerpc-poky-linux-gnuspe-g++ (GCC) 4.8.1; LOCAL_COMPILE: g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010... หากคุณต้องการทดสอบ สิ่งที่ล้มเหลวคือคอมไพเลอร์ ppc toolchain ซึ่งดูเหมือนว่าจะล้มเหลวในการดูแลคำสั่งการประกาศ - person MDeero; 06.07.2016