การสร้าง gdb 10.1 จากซอร์สด้วย python แบบกำหนดเอง

ฉันกำลังพยายามสร้าง gdb 10.1 ล่าสุดจากแหล่งที่มา

[เหตุผลของฉันที่ต้องการทำคือฉันกำลังพยายามดีบักโปรแกรมที่ลิงก์ไปยังบิลด์ที่กำหนดเองของ Python 2.7.18 และระบบของฉัน gdb เชื่อมโยงกับบิลด์ของ Python 2.7.5 ในไดเร็กทอรี /lib64 ของฉันและ ใช้งานไม่ได้กับเวอร์ชันที่ใหม่กว่า]

หลังจากอ่านไฟล์ README แล้ว ฉันได้กำหนดค่าโดยใช้:

../gdb-10.1/configure --with-python=<path to my 2.7.18 installation> --prefix=<path to where I want the new gdb to go>

...แล้ววิ่ง

make all install

...ตามคำแนะนำ อย่างไรก็ตาม ความพยายามทุกครั้งในการสร้างนั้นล้มเหลวด้วยข้อความแสดงข้อผิดพลาดของแบบฟอร์ม:

python/py-arch.o: In function `gdbarch_to_arch_object(gdbarch*)':
.../build/gdb/../../../gdb-10.1/gdb/python/py-arch.c:86: undefined reference to `_Py_RefTotal'
python/py-arch.o: In function `gdbpy_ref_policy<_object>::decref(_object*)':
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_RefTotal'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_NegativeRefcount'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_Dealloc'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_RefTotal'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_RefTotal'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_RefTotal'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_NegativeRefcount'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_Dealloc'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_RefTotal'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_Dealloc'
.../build/gdb/../../../gdb-10.1/gdb/python/py-ref.h:36: undefined reference to `_Py_NegativeRefcount'

ในการตรวจสอบผลลัพธ์ของขั้นตอนการกำหนดค่าและ Makefile เอง ฉันไม่พบการอ้างอิงใด ๆ เกี่ยวกับการติดตั้ง Python ที่ฉันระบุ ณ เวลากำหนดค่า (และที่ฉันวางไว้ที่ส่วนหัวของ LD_LIBRARY_PATH ของฉันด้วย เพื่อให้แน่ใจว่าคอมไพเลอร์ และลิงเกอร์สามารถค้นหาได้เมื่อสร้าง)

ฉันพลาดอะไรไปที่นี่?


person Eos Pengwern    schedule 27.10.2020    source แหล่งที่มา
comment
หากคุณทำ grep PYTHON_CPPFLAGS /path/to/your/build/directory/gdb/config.log (หรือ config.status) ตัวเลือก -I อ้างถึงไดเร็กทอรีที่มี Python.h หรือไม่   -  person Mark Plotnick    schedule 27.10.2020
comment
ไม่ ฉันไม่พบ PYTHON_CPPFLAGS เลย ไม่พบใน makefile เช่นกัน มีหลายที่ใน config.log และ config.status ที่สตริง --with-python ของฉันถูกบันทึก แต่ไม่มีที่ไหนเลยที่ดูเหมือนว่าจะมีการดำเนินการใดๆ ในกรณีนี้   -  person Eos Pengwern    schedule 27.10.2020
comment
ตกลง ดูใน config.log ในไดเร็กทอรี build/gdb เพื่อหาบรรทัดที่ขึ้นต้นด้วย checking whether to use python และ checking compiler flags for python code และดูว่าโปรแกรมทดสอบสำเร็จหรือไม่   -  person Mark Plotnick    schedule 27.10.2020
comment
หืม.. ทุกอย่างในไฟล์ gdb/config.log ดูอย่างที่ฉันคาดหวังไว้ การทดสอบ Python ดำเนินการ และกลับมาเป็นผลลัพธ์: ใช่ และ PYTHON_CPPFLAGS ถูกกำหนดอย่างถูกต้องภายในไฟล์ gdb/config.log และไฟล์ gdb/config.status (ในการตอบกลับครั้งก่อนของฉัน ฉันทำผิดพลาดในการดูเท่านั้น ไดเร็กทอรี build หลัก ไม่ใช่ในไดเร็กทอรีย่อย gdb) เส้นทางที่ถูกต้องไปยัง Python.h จะรวมอยู่ในคำจำกัดความของ INTERNAL_CPPFLAGS ใน gdb/Makefile แต่การสร้างยังคงล้มเหลวตามที่อธิบายไว้เดิม   -  person Eos Pengwern    schedule 28.10.2020
comment
ฉันยังเห็นได้ว่าภายใน gdb/config.h มาโคร WITH_PYTHON_LIBDIR ได้รับการตั้งค่าอย่างถูกต้องเป็นไดเร็กทอรีที่มีไฟล์ libpython2.7.so.1.0 ของฉัน   -  person Eos Pengwern    schedule 28.10.2020
comment
สิ่งที่กำหนดเองเกี่ยวกับบิลด์ Python 2.7.18 ของฉันคือมันถูกสร้างขึ้นโดยใช้สวิตช์คอมไพเลอร์ -fno-semantic-interposition และสวิตช์ตัวเชื่อมโยง --default-symver สิ่งนี้อาจมีผลหรือไม่? ฉันไม่สามารถบอกได้ว่าข้อความแสดงข้อผิดพลาดอ้างอิงที่ไม่ได้กำหนดหมายถึงขั้นตอนการคอมไพล์หรือระยะตัวเชื่อมโยง แม้ว่าข้อเท็จจริงที่ว่ามันเกี่ยวข้องกับไฟล์ .h ทำให้ข้อความแรกมีแนวโน้มมากขึ้น   -  person Eos Pengwern    schedule 28.10.2020
comment
ดูหมายเหตุด้านล่าง: ในที่สุด ฉันก็ทำแบบเดียวกันอีกครั้งโดยตั้งค่า --with-python เป็นการติดตั้ง Python ของระบบใน /usr/bin/python นั่นใช้ได้ผลดี! เห็นได้ชัดว่าปัญหาเกิดขึ้นกับ Python ของฉันเอง (แม้ว่าจะทำงานได้ดีกับทุกสิ่งที่ฉันได้ลองใช้) หรือบางแง่มุมที่คลุมเครือมากของเส้นทางไปยังมัน   -  person Eos Pengwern    schedule 28.10.2020
comment
คุณช่วยบอกข้อโต้แย้งที่คุณให้กับ .../configure สำหรับทั้ง gdb และ python ให้เราหน่อยได้ไหม   -  person Mark Plotnick    schedule 28.10.2020
comment
ให้เราสนทนาต่อในการแชท   -  person Eos Pengwern    schedule 28.10.2020


คำตอบ (1)


เมื่อเร็ว ๆ นี้ฉันทำสิ่งที่คล้ายกันและต้องดิ้นรนแม้ว่าจะมีปัญหาต่างกันก็ตาม

ฉันสงสัยว่าปัญหาการสร้างของคุณอาจเกี่ยวข้องกับการใช้ LD_LIBRARY_PATH หรือสิ่งอื่น ๆ ที่มาจากสภาพแวดล้อมของคุณ (PATH, CFLAGS, LDFLAGS ฯลฯ ) คุณไม่ควรต้องตั้งค่าเหล่านี้ระหว่างการสร้าง

ต่อไปนี้เป็นโครงร่างของสิ่งที่ฉันทำ:

(1) สำหรับการสร้าง gdb ฉันใช้วิธีการดังนี้:

export PATH=/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin
unset LD_LIBRARY_PATH 
../gdb-10.1/configure --prefix=/opt/gdb-10.1  --with-python=/opt/conda-py2.7.18 
make         &> make.log
make install &> make-install.log

ชุดของ PATH และการยกเลิกการตั้งค่า LD_LIBRARY_PATH มีจุดมุ่งหมายเพื่อทำให้สภาพแวดล้อมสะอาด สิ่งนี้ทำให้มั่นใจได้ว่าบิลด์สามารถใช้ --with-python สำหรับการค้นหาหลามเท่านั้น (ซึ่งตัวมันเองอยู่ที่ bin/python ภายใต้คำนำหน้าหลาม) (ไม่ได้ตั้งค่า CFLAGS & LDFLAGS หรือตัวแปร PYTHON ใด ๆ )

ฉันเก็บผลลัพธ์ของขั้นตอนการสร้างไว้ หากคุณดูในนั้น คุณจะเห็นตัวเลือก with-python ปรากฏขึ้น

ทั้งหมดนี้สร้างขึ้นอย่างดี

(2) ในการเรียกใช้ดีบักเกอร์ (และใช้ python ของฉันภายใต้ /opt) ฉันต้องการขั้นตอนเพิ่มเติม: เพื่อตั้งค่า LD_LIBRARY_PATH เพื่อให้ pythons ของฉัน libpython ถูกใช้:

export LD_LIBRARY_PATH=/opt/conda-py2.7.18/lib
/opt/gdb-10.1/bin/gdb
(gdb) python import sys; print(sys.version)
2.7.18 | Anaconda, Inc.

คงจะดีไม่น้อยหากหาวิธีหลีกเลี่ยงความจำเป็นในการตั้งค่า LD_LIBRARY_PATH สิ่งนี้อาจต้องมีการเชื่อมโยง libpython แบบคงที่ หรือการแนะนำแฟล็กบิลด์บางตัว เช่น เพื่อใช้ rpath

person Darren Smith    schedule 27.10.2020
comment
มาเริ่มกันเลย; ปัญหาทั้งหมดนี้เกิดขึ้นเมื่อฉันตั้งค่า LD_LIBRARY_PATH เนื่องจากก่อนหน้านี้ฉันทำแอปพลิเคชันของตัวเองไม่พบ Python build ที่จำเป็น ครั้งหนึ่งฉันได้ตั้งค่าไว้ว่าฉันพบว่าแอปพลิเคชันของฉันใช้งานได้ แต่ดีบักเกอร์ไม่ทำงานอีกต่อไป! - person Eos Pengwern; 27.10.2020
comment
ตกลง ฉันลองสร้างอีกครั้งโดยใช้ PATH น้อยที่สุด โดยเว้น LD_LIBRARY_PATH ว่างไว้ และตรวจดูให้แน่ใจว่าไม่มีการตั้งค่าตัวแปร PYTHON เช่น PYTHONPATH/PYTHONHOME) หรือตัวแปร FLAGS ฉันยังลองใช้กับเครื่องที่แตกต่างอย่างสิ้นเชิงด้วย Python build เดียวกัน ผลลัพธ์เดียวกัน ในที่สุด ฉันก็ทำแบบเดียวกันอีกครั้งโดยตั้งค่า --with-python เป็นการติดตั้ง Python ของระบบใน /usr/bin/python นั่นใช้ได้ผลดี! เห็นได้ชัดว่าปัญหาเกิดขึ้นกับ Python ของฉันเอง (แม้ว่าจะทำงานได้ดีกับทุกสิ่งที่ฉันได้ลองใช้) หรือบางแง่มุมที่คลุมเครือมากของเส้นทางไปยังมัน - person Eos Pengwern; 28.10.2020
comment
เมื่อคุณสร้าง Python แบบกำหนดเอง คุณได้เพิ่ม --with-pydebug เพื่อสร้างการแก้ไขข้อบกพร่องหรือไม่ ที่สามารถแนะนำสัญลักษณ์การดีบักเพิ่มเติม (เช่น _Py_RefTotal) ดังนั้นอาจเป็นอีกสาเหตุหนึ่ง - person Darren Smith; 28.10.2020
comment
น่าสนใจที่คุณควรบอกว่า: ทุกสิ่งที่รายงานข้างต้นเกี่ยวกับบิลด์ที่กำหนดเองของฉันเกี่ยวข้องกับเวอร์ชันที่คอมไพล์ด้วย --with-pydebug ฉันมีบิลด์อื่นที่คอมไพล์โดยไม่มีมัน ดังนั้นฉันจึงลองใช้สิ่งนี้... และได้รับข้อผิดพลาดที่คล้ายกันแต่แตกต่างกัน คราวนี้เกี่ยวข้องกับการอ้างอิงที่ไม่ได้กำหนดไปยัง PyUnicodeUCS2_Decode และฟังก์ชันอื่น ๆ ในตระกูลนั้น ตอนนี้ ฉันได้ตรวจสอบแล้วว่า Python แบบกำหนดเองของฉันถูกคอมไพล์โดยใช้ UCS2 (print sys.maxunicode ส่งกลับ 65535) ดังนั้นฉันจึงไม่ได้รู้สึกฉลาดไปกว่านี้มากนัก - person Eos Pengwern; 28.10.2020
comment
การมีอยู่ของสัญลักษณ์ที่หายไป เช่น _Py_RefTotal เป็นเพราะคุณสร้าง python ด้วย --with-pydebug ฉันคิดว่าคุณควรพยายามสร้าง Python ที่เรียบง่ายและสะอาดตา เช่น ลดจำนวนแฟล็ก และดูว่าจะช่วยแก้ปัญหาต่างๆ ได้หรือไม่ ขณะนี้คุณมีชิ้นส่วนที่เคลื่อนไหวบางส่วน ฯลฯ - person Darren Smith; 28.10.2020
comment
เพื่อสิ่งที่คุ้มค่า ฉันได้แก้ไขปัญหาที่ซ่อนอยู่ด้วยวิธีอื่น ฉันได้เพิ่มเส้นทางไปยัง Python build แบบกำหนดเองชั่วคราวไปยัง RPATH ของแอปพลิเคชันของฉัน (โดยใช้คุณสมบัติ BUILD_RPATH ของ CMake) เพื่อให้แอปพลิเคชันของฉันเองรับ Python แบบกำหนดเองในเวลาเดียวกันกับที่ gdb ใช้ Python มาตรฐาน - person Eos Pengwern; 29.10.2020