GNU风格代码编译(27)

server/2024/9/22 22:30:27/

1makefile 的规则

命令必须使用tab 按键, 而不能使用 空格按键。

1. TARGET=start   
2. TARGETC=main
3. all:
4. 		arm-none-linux-gnueabi-gcc -O0 -g -c -o $(TARGETC).o  $(TARGETC).c
5. 	 	arm-none-linux-gnueabi-gcc -O0 -g -c -o $(TARGET).o $(TARGET).s
6.   	#arm-none-linux-gnueabi-gcc -O0 -g -S -o $(TARGETC).s  $(TARGETC).c		
7. 	 	arm-none-linux-gnueabi-ld	$(TARGETC).o	$(TARGET).o -Ttext 0x40008000 -o $(TARGET).elf
8. 	 	arm-none-linux-gnueabi-objcopy   -O binary -S  $(TARGET).elf  $(TARGET).bin
9. clean:
10. 	rm -rf *.o *.elf *.dis *.bin

这里的 -O0 代表的是优化的标准, -g,表示增加调试信息,  -c , -o 就不用说了。

-Ttext 代表的是,程序的运行地址。 -O binary 代表的是 生成二进制文件。 -S带表的是 去掉不要重定位信息和符号信息,缩小了文件尺寸。

2   然后是连接脚本的分析。

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{. = 0x40008000;. = ALIGN(4);.text      :{.start.o(.text)*(.text)}. = ALIGN(4);.rodata : { *(.rodata) }. = ALIGN(4);.data : { *(.data) }. = ALIGN(4);.bss :{ *(.bss) }
}

我觉得 这个链接脚本没什么需要讲的,

最主要的是 搞清楚 如何在程序中定义自己的段。

网上的资料

另一个例子

这里的

#define func_init(func) myown_call _fn_##func _init = func

最终展开就是

#define func_init(func)    myown_call    _fn_##func  __attribute__((unused, section(".myown")))     = func

这里的 func 单词都是可以替换成具体的函数指针的。

这里也就是 定义了一个函数指针,并且附上了值。

3 然后是 uboot ,以及内核的连接脚本的举例。

OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
OUTPUT_ARCH(aarch64)
ENTRY(_start)
SECTIONS
{. = 0x00000000;. = ALIGN(8);.text :{*(.__image_copy_start)arch/arm/cpu/armv8/start.o (.text*)*(.text*)}. = ALIGN(8);.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }. = ALIGN(8);.data : {*(.data*)}. = ALIGN(8);. = .;. = ALIGN(8);.u_boot_list : {KEEP(*(SORT(.u_boot_list*)));}. = ALIGN(8);.efi_runtime : {__efi_runtime_start = .;*(efi_runtime_text)*(efi_runtime_data)__efi_runtime_stop = .;}.efi_runtime_rel : {__efi_runtime_rel_start = .;*(.relaefi_runtime_text)*(.relaefi_runtime_data)__efi_runtime_rel_stop = .;}. = ALIGN(8);.image_copy_end :{*(.__image_copy_end)}. = ALIGN(8);.rel_dyn_start :{*(.__rel_dyn_start)}.rela.dyn : {*(.rela*)}.rel_dyn_end :{*(.__rel_dyn_end)}_end = .;. = ALIGN(8);.bss_start : {KEEP(*(.__bss_start));}.bss : {*(.bss*). = ALIGN(8);}.bss_end : {KEEP(*(.__bss_end));}/DISCARD/ : { *(.dynsym) }/DISCARD/ : { *(.dynstr*) }/DISCARD/ : { *(.dynamic*) }/DISCARD/ : { *(.plt*) }/DISCARD/ : { *(.interp*) }/DISCARD/ : { *(.gnu*) }

这个链接脚本整体上还是 比较规范的,没有什么幺蛾子。

入口点就是 _start , 就在 start.o里面。

就是这里。

但是内核的 lds 文件就比较恶心了。

OUTPUT_ARCH(aarch64)
ENTRY(_text)
jiffies = jiffies_64;
PECOFF_FILE_ALIGNMENT = 0x200;
SECTIONS
{/DISCARD/ : {*(.exitcall.exit)*(.discard)*(.discard.*)*(.interp .dynamic)*(.dynsym .dynstr .hash .gnu.hash)*(.eh_frame)}. = ((((((0xffffffffffffffff)) - (((1)) << (39)) + 1) + (0)) + (0x08000000))) + 0x00080000;.head.text : {_text = .;KEEP(*(.head.text))}.text : {_stext = .;__exception_text_start = .;*(.exception.text)__exception_text_end = .;. = ALIGN(8); __irqentry_text_start = .; *(.irqentry.text) __irqentry_text_end = .;. = ALIGN(8); __softirqentry_text_start = .; *(.softirqentry.text) __softirqentry_text_end = .;. = ALIGN(8); __entry_text_start = .; *(.entry.text) __entry_text_end = .;. = ALIGN(8); *(.text.hot .text.hot.*) *(.text .text.fixup) *(.text.unlikely .text.unlikely.*) *(.text.unknown .text.unknown.*) *(.text.cfi) . = ALIGN(8); __noinstr_text_start = .; *(.noinstr.text) __noinstr_text_end = .; *(.text..refcount) *(.text..ftrace) *(.ref.text) *(.text.asan.* .text.tsan.*). = ALIGN(8); __sched_text_start = .; *(.sched.text) __sched_text_end = .;. = ALIGN(8); __cpuidle_text_start = .; *(.cpuidle.text) __cpuidle_text_end = .;. = ALIGN(8); __lock_text_start = .; *(.spinlock.text) __lock_text_end = .;. = ALIGN(8); __kprobes_text_start = .; *(.kprobes.text) __kprobes_text_end = .;. = ALIGN(0x00001000); __hyp_idmap_text_start = .; *(.hyp.idmap.text) __hyp_idmap_text_end = .; __hyp_text_start = .; *(.hyp.text) . = ALIGN(0x00000008); __start___kvm_ex_table = .; *(__kvm_ex_table) __stop___kvm_ex_table = .; __hyp_text_end = .;. = ALIGN(0x00001000); __idmap_text_start = .; *(.idmap.text) __idmap_text_end = .;. = ALIGN((1 << 12)); __entry_tramp_text_start = .; *(.entry.tramp.text) . = ALIGN((1 << 12)); __entry_tramp_text_end = .;*(.fixup)*(.gnu.warning). = ALIGN(16);*(.got)}. = ALIGN(0x00010000);_etext = .;. = ALIGN(((1 << 12))); .rodata : AT(ADDR(.rodata) - 0) { __start_rodata = .; *(.rodata) *(.rodata.*) . = ALIGN(8); __start_ro_after_init = .; *(.data..ro_after_init) __end_ro_after_init = .; KEEP(*(__vermagic)) . = ALIGN(8); __start___tracepoints_ptrs = .; KEEP(*(__tracepoints_ptrs)) __stop___tracepoints_ptrs = .; *(__tracepoints_strings) } .rodata1 : AT(ADDR(.rodata1) - 0) { *(.rodata1) } .pci_fixup : AT(ADDR(.pci_fixup) - 0) { __start_pci_fixups_early = .; KEEP(*(.pci_fixup_early)) __end_pci_fixups_early = .; __start_pci_fixups_header = .; KEEP(*(.pci_fixup_header)) __end_pci_fixups_header = .; __start_pci_fixups_final = .; KEEP(*(.pci_fixup_final)) __end_pci_fixups_final = .; __start_pci_fixups_enable = .; KEEP(*(.pci_fixup_enable)) __end_pci_fixups_enable = .; __start_pci_fixups_resume = .; KEEP(*(.pci_fixup_resume)) __end_pci_fixups_resume = .; __start_pci_fixups_resume_early = .; KEEP(*(.pci_fixup_resume_early)) __end_pci_fixups_resume_early = .; __start_pci_fixups_suspend = .; KEEP(*(.pci_fixup_suspend)) __end_pci_fixups_suspend = .; __start_pci_fixups_suspend_late = .; KEEP(*(.pci_fixup_suspend_late)) __end_pci_fixups_suspend_late = .; } .builtin_fw : AT(ADDR(.builtin_fw) - 0) ALIGN(8) { __start_builtin_fw = .; KEEP(*(.builtin_fw)) __end_builtin_fw = .; } __ksymtab : AT(ADDR(__ksymtab) - 0) { __start___ksymtab = .; KEEP(*(SORT(___ksymtab+*))) __stop___ksymtab = .; } __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - 0) { __start___ksymtab_gpl = .; KEEP(*(SORT(___ksymtab_gpl+*))) __stop___ksymtab_gpl = .; } __ksymtab_unused : AT(ADDR(__ksymtab_unused) - 0) { __start___ksymtab_unused = .; KEEP(*(SORT(___ksymtab_unused+*))) __stop___ksymtab_unused = .; } __ksymtab_unused_gpl : AT(ADDR(__ksymtab_unused_gpl) - 0) { __start___ksymtab_unused_gpl = .; KEEP(*(SORT(___ksymtab_unused_gpl+*))) __stop___ksymtab_unused_gpl = .; } __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - 0) { __start___ksymtab_gpl_future = .; KEEP(*(SORT(___ksymtab_gpl_future+*))) __stop___ksymtab_gpl_future = .; } __kcrctab : AT(ADDR(__kcrctab) - 0) { __start___kcrctab = .; KEEP(*(SORT(___kcrctab+*))) __stop___kcrctab = .; } __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - 0) { __start___kcrctab_gpl = .; KEEP(*(SORT(___kcrctab_gpl+*))) __stop___kcrctab_gpl = .; } __kcrctab_unused : AT(ADDR(__kcrctab_unused) - 0) { __start___kcrctab_unused = .; KEEP(*(SORT(___kcrctab_unused+*))) __stop___kcrctab_unused = .; } __kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - 0) { __start___kcrctab_unused_gpl = .; KEEP(*(SORT(___kcrctab_unused_gpl+*))) __stop___kcrctab_unused_gpl = .; } __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - 0) { __start___kcrctab_gpl_future = .; KEEP(*(SORT(___kcrctab_gpl_future+*))) __stop___kcrctab_gpl_future = .; } __ksymtab_strings : AT(ADDR(__ksymtab_strings) - 0) { *(__ksymtab_strings) } __init_rodata : AT(ADDR(__init_rodata) - 0) { *(.ref.rodata) } __param : AT(ADDR(__param) - 0) { __start___param = .; KEEP(*(__param)) __stop___param = .; } __modver : AT(ADDR(__modver) - 0) { __start___modver = .; KEEP(*(__modver)) __stop___modver = .; . = ALIGN(((1 << 12))); __end_rodata = .; } . = ALIGN(((1 << 12)));. = ALIGN(8); __ex_table : AT(ADDR(__ex_table) - 0) { __start___ex_table = .; KEEP(*(__ex_table)) __stop___ex_table = .; }.notes : AT(ADDR(.notes) - 0) { __start_notes = .; KEEP(*(.note.*)) __stop_notes = .; }. = ALIGN(0x00010000);__init_begin = .;__inittext_begin = .;. = ALIGN(8); .init.text : AT(ADDR(.init.text) - 0) { _sinittext = .; *(.init.text .init.text.*) *(.text.startup) *(.meminit.text*) _einittext = .; }.exit.text : {*(.exit.text) *(.text.exit) *(.memexit.text)}. = ALIGN(4);.altinstructions : {__alt_instructions = .;*(.altinstructions)__alt_instructions_end = .;}.altinstr_replacement : {*(.altinstr_replacement)}. = ALIGN((1 << 12));__inittext_end = .;__initdata_begin = .;.init.data : {KEEP(*(SORT(___kentry+*))) *(.init.data init.data.*) *(.meminit.data*) . = ALIGN(8); __start_mcount_loc = .; KEEP(*(__mcount_loc)) __stop_mcount_loc = .; *(.init.rodata .init.rodata.*) . = ALIGN(8); __start_ftrace_events = .; KEEP(*(_ftrace_events)) __stop_ftrace_events = .; __start_ftrace_eval_maps = .; KEEP(*(_ftrace_eval_map)) __stop_ftrace_eval_maps = .; *(.meminit.rodata) . = ALIGN(8); __clk_of_table = .; KEEP(*(__clk_of_table)) KEEP(*(__clk_of_table_end)) . = ALIGN(8); __reservedmem_of_table = .; KEEP(*(__reservedmem_of_table)) KEEP(*(__reservedmem_of_table_end)) . = ALIGN(8); __timer_of_table = .; KEEP(*(__timer_of_table)) KEEP(*(__timer_of_table_end)) . = ALIGN(8); __cpu_method_of_table = .; KEEP(*(__cpu_method_of_table)) KEEP(*(__cpu_method_of_table_end)) . = ALIGN(8); __cpuidle_method_of_table = .; KEEP(*(__cpuidle_method_of_table)) KEEP(*(__cpuidle_method_of_table_end)) . = ALIGN(32); __dtb_start = .; KEEP(*(.dtb.init.rodata)) __dtb_end = .; . = ALIGN(8); __irqchip_of_table = .; KEEP(*(__irqchip_of_table)) KEEP(*(__irqchip_of_table_end)) . = ALIGN(8); __earlycon_table = .; KEEP(*(__earlycon_table)) __earlycon_table_end = .;. = ALIGN(16); __setup_start = .; KEEP(*(.init.setup)) __setup_end = .;__initcall_start = .; KEEP(*(.initcallearly.init)) __initcall0_start = .; KEEP(*(.initcall0.init)) __initcall0s_start = .; KEEP(*(.initcall0s.init)) __initcall1_start = .; KEEP(*(.initcall1.init)) __initcall1s_start = .; KEEP(*(.initcall1s.init)) __initcall2_start = .; KEEP(*(.initcall2.init)) __initcall2s_start = .; KEEP(*(.initcall2s.init)) __initcall3_start = .; KEEP(*(.initcall3.init)) __initcall3s_start = .; KEEP(*(.initcall3s.init)) __initcall4_start = .; KEEP(*(.initcall4.init)) __initcall4s_start = .; KEEP(*(.initcall4s.init)) __initcall5_start = .; KEEP(*(.initcall5.init)) __initcall5s_start = .; KEEP(*(.initcall5s.init)) __initcallrootfs_start = .; KEEP(*(.initcallrootfs.init)) __initcallrootfss_start = .; KEEP(*(.initcallrootfss.init)) __initcall6_start = .; KEEP(*(.initcall6.init)) __initcall6s_start = .; KEEP(*(.initcall6s.init)) __initcall7_start = .; KEEP(*(.initcall7.init)) __initcall7s_start = .; KEEP(*(.initcall7s.init)) __initcall_end = .;__con_initcall_start = .; KEEP(*(.con_initcall.init)) __con_initcall_end = .;__security_initcall_start = .; KEEP(*(.security_initcall.init)) __security_initcall_end = .;. = ALIGN(4); __initramfs_start = .; KEEP(*(.init.ramfs)) . = ALIGN(8); KEEP(*(.init.ramfs.info))*(.init.rodata.* .init.bss)}.exit.data : {*(.exit.data .exit.data.*) *(.fini_array .fini_array.*) *(.dtors .dtors.*) *(.memexit.data*) *(.memexit.rodata*)}. = ALIGN((1 << 12)); .data..percpu : AT(ADDR(.data..percpu) - 0) { __per_cpu_load = .; __per_cpu_start = .; *(.data..percpu..first) . = ALIGN((1 << 12)); *(.data..percpu..page_aligned) . = ALIGN((1 << (6))); *(.data..percpu..read_mostly) . = ALIGN((1 << (6))); *(.data..percpu) *(.data..percpu..shared_aligned) __per_cpu_end = .; }.rela.dyn : ALIGN(8) {*(.rela .rela*)}__rela_offset = ABSOLUTE(ADDR(.rela.dyn) - ((((((0xffffffffffffffff)) - (((1)) << (39)) + 1) + (0)) + (0x08000000))));__rela_size = SIZEOF(.rela.dyn);. = ALIGN(0x00010000);__initdata_end = .;__init_end = .;_data = .;_sdata = .;. = ALIGN((1 << 12)); .data : AT(ADDR(.data) - 0) { . = ALIGN((2 * (((1)) << (14 + 0)))); __start_init_task = .; init_thread_union = .; init_stack = .; KEEP(*(.data..init_task)) KEEP(*(.data..init_thread_info)) . = __start_init_task + (((1)) << (14 + 0)); __end_init_task = .; . = ALIGN((1 << 12)); __nosave_begin = .; *(.data..nosave) . = ALIGN((1 << 12)); __nosave_end = .; . = ALIGN((1 << 12)); *(.data..page_aligned) . = ALIGN((1 << 12)); . = ALIGN((1 << (6))); *(.data..cacheline_aligned) . = ALIGN((1 << (6))); *(.data..read_mostly) . = ALIGN((1 << (6))); *(.xiptext) *(.data) *(.ref.data) *(.data..shared_aligned) *(.data.unlikely) __start_once = .; *(.data.once) __end_once = .; . = ALIGN(32); *(__tracepoints) . = ALIGN(8); __start___jump_table = .; KEEP(*(__jump_table)) __stop___jump_table = .; . = ALIGN(8); __start___verbose = .; KEEP(*(__verbose)) __stop___verbose = .; __start___trace_bprintk_fmt = .; KEEP(*(__trace_printk_fmt)) __stop___trace_bprintk_fmt = .; . = ALIGN(32); __start__bpf_raw_tp = .; KEEP(*(__bpf_raw_tp_map)) __stop__bpf_raw_tp = .; __start___tracepoint_str = .; KEEP(*(__tracepoint_str)) __stop___tracepoint_str = .; CONSTRUCTORS } . = ALIGN(8); __bug_table : AT(ADDR(__bug_table) - 0) { __start___bug_table = .; KEEP(*(__bug_table)) __stop___bug_table = .; }.mmuoff.data.write : ALIGN(0x00000800) {__mmuoff_data_start = .;*(.mmuoff.data.write)}. = ALIGN(0x00000800);.mmuoff.data.read : {*(.mmuoff.data.read)__mmuoff_data_end = .;}__pecoff_data_rawsize = ABSOLUTE(. - __initdata_begin);_edata = .;. = ALIGN(0); __bss_start = .; . = ALIGN(0); .sbss : AT(ADDR(.sbss) - 0) { *(.dynsbss) *(.sbss) *(.scommon) } . = ALIGN(0); .bss : AT(ADDR(.bss) - 0) { . = ALIGN((1 << 12)); *(.bss..page_aligned) . = ALIGN((1 << 12)); *(.dynbss) *(.bss) *(COMMON) } . = ALIGN(0); __bss_stop = .;. = ALIGN((1 << 12));idmap_pg_dir = .;. += ((((((48)) - 4) / (12 - 3)) - 1) * (1 << 12));tramp_pg_dir = .;. += (1 << 12);swapper_pg_dir = .;. += ((1 << 12) * ( 1 + ((((((_end)) - 1) >> (((12 - 3) * (4 - (4 - 3)) + 3))) - (((((((((0xffffffffffffffff)) - (((1)) << (39)) + 1) + (0)) + (0x08000000))) + 0x00080000)) >> (((12 - 3) * (4 - (4 - 3)) + 3))) + 1 + (0))) + (0) + (0)));swapper_pg_end = .;__pecoff_data_size = ABSOLUTE(. - __initdata_begin);_end = .;.stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) }_kernel_size_le_lo32 = (((_end - _text) & 0xffffffff) & 0xffffffff); _kernel_size_le_hi32 = (((_end - _text) >> 32) & 0xffffffff); _kernel_offset_le_lo32 = (((0x00080000) & 0xffffffff) & 0xffffffff); _kernel_offset_le_hi32 = (((0x00080000) >> 32) & 0xffffffff); _kernel_flags_le_lo32 = (((((0 << 0) | (((12 - 10) / 2) << 1) | (1 << 3))) & 0xffffffff) & 0xffffffff); _kernel_flags_le_hi32 = (((((0 << 0) | (((12 - 10) / 2) << 1) | (1 << 3))) >> 32) & 0xffffffff);
}
ASSERT(__hyp_idmap_text_end - (__hyp_idmap_text_start & ~(0x00001000 - 1)) <= 0x00001000,"HYP init code too big or misaligned")
ASSERT(__idmap_text_end - (__idmap_text_start & ~(0x00001000 - 1)) <= 0x00001000,"ID map text too big or misaligned")
ASSERT((__entry_tramp_text_end - __entry_tramp_text_start) == (1 << 12),"Entry trampoline text too big")
ASSERT(_text == (((((((0xffffffffffffffff)) - (((1)) << (39)) + 1) + (0)) + (0x08000000))) + 0x00080000), "HEAD is misaligned")

设置 我连 入口 都很难找。

它说入口是 _text

但是 _text 是一个 .

那这里 是不是 说如果就是 .head.text 段的第一条指令呢。

网上找到 入口的文件是  arch/arm64/kernel/head.S

我估计 这里的entry 相当于 标号的意思吧。


http://www.ppmy.cn/server/117562.html

相关文章

获取某宝拍立淘API接口:深度学习图像实现匹配和检索

1. 总体概述 拍立淘的核心技术在于图像识别与检索&#xff0c;融合了深度学习、计算机视觉、大数据处理等多个领域的先进技术1。通过构建大规模的商品图像数据库&#xff0c;并利用深度学习算法提取图像特征&#xff0c;实现高效的图像匹配与检索1。 2. 具体技术环节 &#…

【计算机组成原理强化】王道强化课笔记

P1 计组大题备考策略&存储系统串讲 1.基本信息 2.段式和段页式大概率不考大题 3.安装在外存的App&#xff0c;在调入内存的时候大小和外存不等。调入内存时&#xff0c;最多分配的空间和操作系统是多少位有关&#xff0c;比如32位操作系统&#xff0c;给每个进程最多分配4…

matlab在控制台输出某个变量的值

在 MATLAB 中&#xff0c;要在控制台&#xff08;命令窗口&#xff09;输出变量的值&#xff0c;可以使用几种不同的方法&#xff1a; 1. 使用 disp 函数 disp 函数用于显示变量的值&#xff0c;适用于简洁的输出。 % 创建一个变量 x 42;% 在控制台输出变量值 disp(x);2. 使…

小琳AI课堂:大语言模型如何符合伦理限制

大家好&#xff0c;这里是小琳AI课堂。今天我们来聊聊大语言模型是如何符合伦理限制的&#xff0c;这可是一个非常重要的话题哦&#xff01;&#x1f31f; 首先&#xff0c;我们要知道&#xff0c;大语言模型的伦理限制实现主要通过以下几个方面&#xff1a; 数据筛选和清洗&a…

Vm软件安装_链接相机

工业相机的驱动连接 下载安装MVS MVS 客户端支持安装在 Windows XP/7/10 32/64bit&#xff0c;Linux 32/64bits 以及MacOS64bits操作系统上。本文以 Windows 系统为例进行介绍。 具体操作步骤如下&#xff1a; 请从海康机器人官网&#xff08;www.hikrobotics.com&#xff0…

CSS3 过渡

CSS3 过渡&#xff08;Transitions&#xff09;是一种在属性值变化时创建平滑过渡效果的技术。通过过渡&#xff0c;你可以在 CSS 样式发生变化时&#xff0c;定义动画效果&#xff0c;使用户体验更加流畅和自然。 一 基本概念 CSS3 过渡允许你在属性值变化时指定过渡的持续时…

Lua垃圾回收机制

Lua垃圾回收机制 在 Lua 中&#xff0c;一共只有8种数据类型&#xff0c;分别为 nil 、boolean 、userdata 、number 、string 、 table 、 function 、 userdata 和 thread 。其中&#xff0c;只有 string table function thread 四种是以引用方式共享&#xff0c;是需要被 G…

【数据结构】顺序表和链表经典题目

系列文章目录 单链表 动态顺序表实现通讯录 顺序表 文章目录 系列文章目录前言一、顺序表经典例题1. 移除元素2. 合并两个有序数组 二、链表经典例题1. 移除链表元素2. 反转链表3. 合并两个有序链表4. 链表的中间节点5. 环形链表的约瑟夫问题 总结 前言 我们通过前面对顺序表…