Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9647236
  • 博文数量: 1772
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20311
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1772)

文章存档

2025年(21)

2024年(27)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: Android平台

2015-08-29 09:34:51


点击(此处)折叠或打开

  1. 加上-Wl,–no-undefined
  2. 如果so里有未定义符号,这编译不通过

  3. gcc常用编译选项
  4.        -c 表示仅仅汇编及编译代码,不进行链接,也就是将源代码编译成 .o 文件

  5.        -o 指定输出文件的文件名

  6.        -g 调试信息生成,不跟数字默认为-g2,-g1是基本信息的加入,-g3连宏信息都附加进去,附加调试信息显著增加ELF文件大小,但不会影响生成代码的大小

  7.        -s 符号表删除

  8.        -w 关闭所有警

  9.        -D 定义宏,如:gcc –D_DEBUG = 1 -c xxx.c -o xxx

  10.        -E 只进行预处理,不汇编

  11.        -I 将指定路径添加到include的搜索路径

  12.        -S 只进行编译,不汇编

  13.        -O 优化选项,后面跟数字表示优化级别,-O0表示不优化,-O1、-O2、-O3优化程度依次递增

  14.        -Wall 打开所有的编译告警(实际上只打开大部分,部分要单独开启)

  15.        -Werror 将所有的编译告警转化为编译错误,只要有告警就停止编译

  16.        -include 在源文件前面含指定的头文件

  17.        -fstack-protector 堆栈保护,仅为局部变量中包含长度不小于8 byte的char数组的函数插入保护代码

  18.        -fstack-protector-all 为所有的(以下)局部变量插入保护代码:局部变量的地址作为赋值语句的右值或函数参数、局部变量包含数组类型的局部变量(不管数组长度)、带register声明的局部变量

  19.        -D_FORTIFY_SOURCE gcc编译器和glibc库配合,协同提供在编译时和运行时对固定大小的(动态分配和静态声明)缓冲区的访问检查,该选项能提供编译时和运行时的双重检查保护,建议和-O2一起使用:-D_FORTIFY_SOURCE=2 –O2

  20.        -Wformat 检查printf、scanf等函数调用,以确保提供的参数格式字符串合法有效,不合法则告警

  21.        -fPIC –fpic Position-independent Code 为共享库产生位置无关代码

  22.        -fPIE –fpie Position-independent Code为可执行文件提供产生位置无关代码

  23.        -Wl,-z,now 共享库或程序在加载完成后立即进行符号绑定,一般与-Wl,-z,relro一起使用(完全开启relro)

  24.        -Wl,-z,relro 全局偏移表GOT只读(部分开启relro)

  25.        -ftrapv 检测加、减、乘三种运算的运行时溢出,并在溢出时触发SIGABRT

  26.        -Wl,-z,noexecstack 告知编译器在生成目标文件时,将特定的内存区域(数据段以及堆栈段)标记为不可执行的,这个信息记录在ELF文件的GNU_STACK程序头,内核根据该信息来判定一个进程是否在堆栈及数据段可执行代码。

  27.        -Wextra 打印额外的一些告警信息



for jetsonTK1 EVK board:

点击(此处)折叠或打开

  1. arm-linux-gnueabihf-gcc

  2. -nostdinc


  3. -isystem /usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/include
  4. -I/home/tk1/linux/kernel/arch/arm/include -Iarch/arm/include/generated
  5. -include /home/tk1/linux/kernel/include/linux/kconfig.h


  6. -D__KERNEL__
  7. -mlittle-endian
  8. -Wall
  9. -Wundef
  10. -Wstrict-prototypes
  11. -Wno-trigraphs
  12. -fno-strict-aliasing
  13. -fno-common
  14. -Werror-implicit-function-declaration
  15. -Wno-format-security
  16. -fno-delete-null-pointer-checks
  17. -O2
  18. -fconserve-stack
  19. -fno-dwarf2-cfi-asm
  20. -fno-conserve-stack
  21. -mabi=aapcs-linux
  22. -mno-thumb-interwork
  23. -funwind-tables
  24. -marm
  25. -D__LINUX_ARM_ARCH__=7
  26. -march=armv7-a
  27. -msoft-float
  28. -Uarm
  29. -Wframe-larger-than=1024
  30. -fno-stack-protector
  31. -Wno-unused-but-set-variable
  32. -g
  33. -pg
  34. -fno-inline-functions-called-once
  35. -Wdeclaration-after-statement
  36. -Wno-pointer-sign
  37. -fno-strict-overflow
  38. -DCC_HAVE_ASM_GOTO
  39. -D"KBUILD_STR(s)=#s"
  40. -D"KBUILD_BASENAME=KBUILD_STR(fbcmap)"
  41. -D"KBUILD_MODNAME=KBUILD_STR(fb)"
  42. -c -o drivers/video/fbcmap.o drivers/video/fbcmap.c;


  43. if [ "-pg" = "-pg" ]; then
  44.     if [ drivers/video/fbcmap.o != "scripts/mod/empty.o" ]; then /home/tk1/linux/kernel/scripts/recordmcount "drivers/video/fbcmap.o";
  45.     fi;
  46. fi

点击(此处)折叠或打开

  1. -rpath 和 -rpath-link 是 GCC 编译器中用于指定动态链接库搜索路径的选项。它们在编译和链接阶段帮助定位共享库文件

  2. ---------------------------------------
  3. -rpath:

  4. 作用:在可执行文件或共享库中嵌入一个运行时库搜索路径。
  5. 使用场景:当你希望在程序运行时,操作系统能够自动找到特定位置的共享库,而不需要依赖系统的默认路径(如 /usr/lib 或 /lib)。
  6. gcc -o myprogram myprogram.o -L/path/to/libs -lmylib -Wl,-rpath,/path/to/libs
  7. myprogram 在运行时会优先从 /path/to/libs 目录下查找 libmylib.so

  8. ---------------------------------------
  9. -rpath-link
  10. 作用:仅在链接阶段使用,告诉链接器在链接时查找共享库的路径,但不会将路径嵌入到{BANNED}最佳终的可执行文件或共享库中。
  11. 使用场景:适用于链接阶段需要临时指定某些共享库的位置,但不希望这些路径影响运行时的行为。
  12. gcc -o myprogram myprogram.o -L/path/to/libs -lmylib -Wl,-rpath-link,/path/to/libs

  13. 链接器会在 /path/to/libs 中查找 libmylib.so,但该路径不会被嵌入到 myprogram 中。

  14. ==========================================
  15. -rpath 会影响运行时的库搜索路径,因此适合用于确保程序在不同环境中都能正确找到所需的共享库。
  16. -rpath-link 只影响链接阶段,不会改变运行时的行为,适合用于解决编译时的依赖问题。
  17. 如果同时使用 -rpath 和 -rpath-link,链接器会先处理 -rpath-link 指定的路径,然后再处理 -rpath 指定的路径。

  18. ==========================================
  19. 实例
  20. 在编译时,{BANNED}最佳后的链接阶段
  21. bin/ld: warning: libatomic.so.1, needed by output/host/arm-buildroot-linux-musleabi/sysroot/usr/lib/libssl.so, not found (try using -rpath or -rpath-link)

  22. 而实际上 libatomic.so.1 是存在/sysroot/lib的.

  23. 解决这个问题
  24. -Wl,-rpath-link,/path/to/libs 即可.

  25. ========================================
  26. 我的一个demo Makeifle
  27. ==================================
  28. Target=dehttps_post
  29. Release=demo_hkc

  30. SrcDir= src uhf/src uhf/src/posix
  31. ExtList= .c ## X2000 资源受限, 暂不使用 C++

  32. Source= $(foreach ext,$(ExtList), \
  33.         $(foreach sd, $(SrcDir), $(wildcard $(addprefix $(sd)/*,$(ext)))))

  34. Objs= $(foreach ext, $(ExtList), \
  35.         $(patsubst %$(ext), %.o, $(filter %$(ext),$(Source))))

  36. URF_LIB_PATH := -L lib
  37. URF_INC_PATH := -I inc -I uhf/inc -Iuhf/src

  38. DEP_LIB_PATH := `pkg-config --libs libcurl openssl zlib`
  39. DEP_INC_PATH := `pkg-config --cflags libcurl openssl zlib`

  40. LIBS_PATH := -ldl -lm -lpthread $(DEP_LIB_PATH) $(URF_LIB_PATH)
  41. INCS_PATH := -Isrc $(URF_INC_PATH)

  42. CFLAGS := -g -O0 -Wno-implicit-function-declaration # -Wno-incompatible-pointer-types -Wno-implicit-function-declaration

  43. CFLAGS += -DPOSIX ### UHF SO 库.

  44. INCFLAGS := $(INCS_PATH)
  45. LDFlags := $(LIBS_PATH) -Wl,-rpath-link,${HISILICON_SYS_HOST}/lib -Wl,-rpath-link,${HISILICON_SYS_HOST}/usr/lib

  46. ### CE100
  47. CFLAGS += --sysroot=${HISILICON_SYS_HOST}

  48. CC=${CROSS_COMPILE_PREFIX}gcc
  49. CPP=${CROSS_COMPILE_PREFIX}g++

  50. %.o : %.c
  51.         $(CC) $(CFLAGS) -c $(@D)/$(<F) -o $(@D)/$(@F) $(INCFLAGS)
  52. %.o : %.cpp
  53.         $(CPP) $(CFLAGS) -c $(@D)/$(<F) -o $(@D)/$(@F) $(INCFLAGS)

  54. INSTALL_PROGRAM = ${INSTALL} -c -s -m 555

  55. $(Target): $(Objs)
  56.         $(CC) $(CFLAGS) -o $(Target) $(Objs) $(LDFlags)
  57.         #chmod u+s $(Target)

  58. all: $(Target)

  59. objs: $(Objs)

  60. install: $(Target)

  61. RM= rm -rf

  62. clean:
  63.         @$(RM) $(foreach sd, $(SrcDir), $(wildcard $(sd)/*.o))
  64.         @$(RM) $(Target) $(Release)

  65. cleanall:clean
  66.         @$(RM) $(Target) $(Release)

  67. rebuild: cleanall all




阅读(2710) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~