链接过程中的符号重定位_C底层18/2/25

本文详细介绍了C语言链接过程中最重要的步骤——符号重定位,解释了其在解决extern等问题中的作用,并推荐了《程序员的自我修养》的相关章节进行深入学习。内容包括预编译、编译、汇编和链接的详细流程,以及强弱符号的处理规则。通过理解这一过程,有助于理解程序的编译和链接机制。

前情提要

  • 对于编译和链接的基本过程,这里只对链接过过程的符号重定位做了解释,因为个人认为在链接过程中符号的重定位是最重要的一步,也是其精华所在,知道了这一步的实现过程可以解决很多问题,包括面试中可能会问到的关于extern等的方面。所以这里只有对符号重定位进行了详细的说明,如果想了解更多可以参看《程序员的自我修养》第2,3,6 章节。里面有很详细的解释。
    如果对虚拟地址空间的内存分布还不够了解的建议先看上一篇博客IA32位Linux内核中的虚拟地址映射
    其中的前面一部分有对虚拟内存分布的分析。

一,编译和链接的总体流程:

  1. 预编译:处理预编译指令(包括宏替换等#指令),删除注释。
    具体如下:
    1)将所有的“#define”删除,并且展开所有的宏定义
    2)处理所有的条件预编译指令,将被包含的文件插入到该预编译指令的位置,注意:这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件。
    3)删除所有的注释”//”,”/* */”。
    4)添加行号和文件名标识。e.g #2 “hello” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号。
    5)保留所有的#pragma 编译器指令。

  2. 编译阶段:进行一系列词法,语法,语义分析及优化后生成相应的汇编代码文件。(gcc -01最高级别优化),汇总符号。各个源文件的编译都是独立的。
    1)扩充gcc
    这里写图片描述

lenovo@lenovo-pc:/media/lenovo/DATA/soft_DMG/Soft/Soft$ box64 ./DamageAssessSoft [BOX64] Box64 arm64 v0.3.6 with Dynarec built on Sep 3 2025 19:15:27 [BOX64] Dynarec for ARM64, with extension: ASIMD AES CRC32 PMULL SHA1 SHA2 [BOX64] Running on Phytium,D2000/8 E8C with 8 cores, pagesize: 4096 [BOX64] Will use hardware counter measured at 48.0 MHz emulating 3.0 GHz [BOX64] Didn't detect 48bits of address space, considering it's 39bits [BOX64] Counted 62 Env var [BOX64] Library search path: [BOX64] Binary search path: ./:bin/:/usr/local/sbin/:/usr/local/bin/:/usr/sbin/:/usr/bin/:/sbin/:/bin/:/usr/games/:/usr/local/games/:/path/to/python3/:/usr/bin/python3.8/ [BOX64] Looking for ./DamageAssessSoft [BOX64] Rename process to "DamageAssessSoft" [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libJW_QtDB_Lib.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libJW_QtIO_Lib.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libJW_View_Lib.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libJW_AppCommon_Lib.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libJW_3DWindow_Lib.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpython3.8.so.1.0 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libonnxruntime.so.1.16.3 [BOX64] Using native(wrapped) libtiff.so.5 [BOX64] Using emulated /usr/lib/box64-x86_64-linux-gnu/libstdc++.so.6 [BOX64] Using native(wrapped) libm.so.6 [BOX64] Using native(wrapped) libc.so.6 [BOX64] Using native(wrapped) ld-linux-x86-64.so.2 [BOX64] Using native(wrapped) libpthread.so.0 [BOX64] Using native(wrapped) libdl.so.2 [BOX64] Using native(wrapped) libutil.so.1 [BOX64] Using native(wrapped) librt.so.1 [BOX64] Using native(wrapped) libbsd.so.0 [BOX64] Using emulated /usr/lib/box64-x86_64-linux-gnu/libgcc_s.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_surface.so.1.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_recognition.so.1.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libboost_system.so.1.64.0 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libflann_cpp.so.1.9 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkRenderingCore-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libopencv_world.so.3.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libQt5Charts.so.5 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libQt5PrintSupport.so.5 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libQt5Widgets.so.5 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libQt5Gui.so.5 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libQt5Sql.so.5 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libQt5Xml.so.5 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libQt5Core.so.5 [BOX64] Using native(wrapped) libz.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libicui18n.so.56 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libicuuc.so.56 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libicudata.so.56 [BOX64] Using native(wrapped) libgthread-2.0.so.0 [BOX64] Using native(wrapped) libglib-2.0.so.0 [BOX64] Look for arc4random in loaded elfs [BOX64] Warning, function arc4random not found in lib libbsd.so.0 [BOX64] Look for arc4random in loaded elfs [BOX64] Warning, function arc4random not found in lib libbsd.so.0 [BOX64] Using native(wrapped) libGL.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libjpeg.so.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpng12.so.0 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkCommonColor-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkFiltersGeometry-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkFiltersSources-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkFiltersGeneral-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkFiltersCore-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkCommonExecutionModel-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkCommonComputationalGeometry-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkCommonDataModel-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkCommonSystem-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtksys-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkCommonTransforms-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkCommonMath-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkCommonCore-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libvtkCommonMisc-8.0.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libboost_filesystem.so.1.64.0 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_io.so.1.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_features.so.1.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_filters.so.1.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_search.so.1.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_kdtree.so.1.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_sample_consensus.so.1.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_common.so.1.8 [BOX64] Using native(wrapped) libgomp.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libboost_thread.so.1.64.0 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_octree.so.1.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libboost_iostreams.so.1.64.0 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libboost_chrono.so.1.64.0 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_io_ply.so.1.8 [BOX64] Using native(wrapped) libusb-1.0.so.0 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libOpenNI2.so.0 [BOX64] Using native(wrapped) libpcap.so.0 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libqhull.so.7 [BOX64] Using native(wrapped) libexpat.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_segmentation.so.1.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_visualization.so.1.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libflann.so.1.9 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libJW_PluginAPI_Lib.so.1 [BOX64] Using native(wrapped) libgmp.so.10 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libJW_FrameBuffer_Lib.so.1 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libQt5OpenGL.so.5 [BOX64] Using native(wrapped) libX11.so.6 [BOX64] Using native(wrapped) libxcb.so.1 [BOX64] Using native(wrapped) libXau.so.6 [BOX64] Using native(wrapped) libXdmcp.so.6 [BOX64] Using native(wrapped) libXt.so.6 [BOX64] Using native(wrapped) libXext.so.6 [BOX64] Error: Global Symbol applicationShellWidgetClass not found, cannot apply R_X86_64_GLOB_DAT @0x3f45d82880 ((nil)) in /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_visualization.so.1.8 [BOX64] Using emulated /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libpcl_ml.so.1.8 [BOX64] Error: Symbol TIFFSetField not found, cannot apply R_X86_64_JUMP_SLOT @0x1009d69e8 (0xb90d6) in /media/lenovo/DATA/soft_DMG/Soft/Soft/DamageAssessSoft [BOX64] Error: Symbol TIFFOpen not found, cannot apply R_X86_64_JUMP_SLOT @0x1009d6ad0 (0xb92a6) in /media/lenovo/DATA/soft_DMG/Soft/Soft/DamageAssessSoft [BOX64] Error: Symbol TIFFNumberOfStrips not found, cannot apply R_X86_64_JUMP_SLOT @0x1009d6d28 (0xb9756) in /media/lenovo/DATA/soft_DMG/Soft/Soft/DamageAssessSoft [BOX64] Error: Symbol TIFFReadEncodedStrip not found, cannot apply R_X86_64_JUMP_SLOT @0x1009d7dc8 (0xbb896) in /media/lenovo/DATA/soft_DMG/Soft/Soft/DamageAssessSoft [BOX64] Error: Symbol TIFFGetField not found, cannot apply R_X86_64_JUMP_SLOT @0x1009d8238 (0xbc176) in /media/lenovo/DATA/soft_DMG/Soft/Soft/DamageAssessSoft [BOX64] Error: Symbol TIFFWriteScanline not found, cannot apply R_X86_64_JUMP_SLOT @0x1009d8548 (0xbc796) in /media/lenovo/DATA/soft_DMG/Soft/Soft/DamageAssessSoft [BOX64] Error: Symbol TIFFStripSize not found, cannot apply R_X86_64_JUMP_SLOT @0x1009d87b8 (0xbcc76) in /media/lenovo/DATA/soft_DMG/Soft/Soft/DamageAssessSoft [BOX64] Error: Symbol TIFFReadTile not found, cannot apply R_X86_64_JUMP_SLOT @0x1009d8ff8 (0xbdcf6) in /media/lenovo/DATA/soft_DMG/Soft/Soft/DamageAssessSoft [BOX64] Error: Symbol TIFFTileSize not found, cannot apply R_X86_64_JUMP_SLOT @0x1009d9950 (0xbefa6) in /media/lenovo/DATA/soft_DMG/Soft/Soft/DamageAssessSoft [BOX64] Error: Symbol TIFFDefaultStripSize not found, cannot apply R_X86_64_JUMP_SLOT @0x1009d99d8 (0xbf0b6) in /media/lenovo/DATA/soft_DMG/Soft/Soft/DamageAssessSoft [BOX64] Error: PltResolver: Symbol TIFFSetErrorHandler(ver 0: TIFFSetErrorHandler) not found, cannot apply R_X86_64_JUMP_SLOT 0x3f15ae6608 (0x3f131cd3c6) in /media/lenovo/DATA/soft_DMG/Soft/Soft/lib/libopencv_world.so.3.1 (local_maplib=(nil), global maplib=0x56bc9460, deepbind=0) QSocketNotifier: Can only be used with threads started with QThread terminate called after throwing an instance of 'CGAL::Assertion_exception' what(): CGAL ERROR: assertion violation! Expr: -CGAL_IA_MUL(-1.1, 10.1) != CGAL_IA_MUL(1.1, 10.1) File: /usr/include/CGAL/Interval_nt.h Line: 279 Explanation: Wrong rounding: did you forget the -frounding-math option if you use GCC (or -fp-model strict for Intel)? [BOX64] NativeBT: /usr/local/bin/box64() [0x34a50c7c] [BOX64] NativeBT: /usr/local/bin/box64() [0x34a885a8] [BOX64] NativeBT: linux-vdso.so.1(__kernel_rt_sigreturn+0) [0x7f9881c5b0] [BOX64] NativeBT: /lib/aarch64-linux-gnu/libc.so.6(gsignal+0xe0) [0x7f9868ec60] [BOX64] NativeBT: /lib/aarch64-linux-gnu/libc.so.6(abort+0x110) [0x7f9867ba68] [BOX64] NativeBT: [0x7f8da1a77c] [BOX64] EmulatedBT: box64(abort+0) [0x30030080] [BOX64] EmulatedBT: ??? [(nil)] [BOX64] 57872|SIGABRT @0x7f9868ec60 (gsignal(/lib/aarch64-linux-gnu/libc.so.6)) (x64pc=0x30030080/"???", rsp=0x7f98316df0, stack=0x7f97b18000:0x7f98318000 own=(nil) fp=0x1009db080), for accessing 0x3e80000e210 (code=-6/prot=0), db=(nil)((nil):(nil)/(nil):(nil)/???:clean, hash:0/0) handler=(nil) RSP-0x20:0x0000003f0b0af274 RSP-0x18:0x0000000000000167 RSP-0x10:0x0000000056c49520 RSP-0x08:0x0000000000000078 RSP+0x00:0x0000003f0b0a09db RSP+0x08:0x0000000058459bb8 RSP+0x10:0x00000000584599b0 RSP+0x18:0x0000000058459a10 RAX:0x000000005840f6e0 RCX:0x0000007f987ca468 RDX:0x0000000000000001 RBX:0x0000000058459f88 RSP:0x0000007f98316df0 RBP:0x00000001009db080 RSI:0x0000000035cd7f48 RDI:0x00000000584599c0 R8:0x00000000ffffffff R9:0x0000007f98316878 R10:0x0000003f0c023220 R11:0x0000007f98316638 R12:0x00000000573441b0 R13:0x0000007f98316e80 R14:0x0000000058459a30 R15:0x0000003f0b254640 ES:0x002b CS:0x0033 SS:0x002b DS:0x002b FS:0x0043 GS:0x0053 已放弃 (核心已转储)
最新发布
09-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值