问题标签 [linker-flags]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
152 浏览

c++ - 为什么在 Xcode 11.3 Step Over(f6​​) 中作为 Step Into(f7) 工作?

在调试 Step Over(f6​​) 时更新到 xcode 11.3 时开始表现类似于 Step Into(f7)。

重现步骤

  1. 为 macOS 命令行工具创建一个新的 Xcode 项目

  2. 用这个改变 main.cpp

    /li>
  3. 转到项目构建设置并添加-Wl,-no_function_starts到“其他链接器标志”

  4. test在调用函数的行添加断点并开始调试

  5. 当断点被击中时尝试 Step Over(f6​​)

  6. 它的行为类似于 Step Into(f7) 并进入测试函数,而不是进入下一个 return 语句。


删除-no_function_starts标志解决了问题

但我想知道为什么使用标志?它的描述在这里

-no_function_starts
默认情况下,链接器会在最终链接映像的 LINKEDIT 中创建一个函数起始地址压缩表。此选项禁用该行为。

这个函数起始地址表的重要性是什么?为什么有人会禁用它?它如何影响跨步的 xcode 行为?

0 投票
1 回答
51 浏览

macos - 在 Mac OS 链接器上使用 gcc 编译代码时链接自定义静态库失败

这是我的 C 语言项目文件的文件结构:
首先是一个 fullCourse 文件夹
fullCourse 文件夹包含三个文件夹:
1. include
2. src
3. lib
4. test
in include 文件夹:
它包含一个头文件:temp.h

temp.h 的代码如下:

在 src 文件夹中:
它包含一个源文件: temp.c

的 temp.cc 代码如下:

然后留在同一个文件夹中,创建 .o 文件如下:

下一步是将这个 temp.o 文件移动到 lib 文件夹,如下所示:

比停留在 lib 文件夹中创建了一个存档(或库)文件,如下所示:

比在 test 文件夹中写了一个源代码来测试 tempTest.c 的库(tempTest.c)
代码如下:

比留在测试文件夹中尝试编译它如下:

但代码未编译,显示以下错误:

请帮我解决这个问题。

0 投票
1 回答
2265 浏览

cygwin - --export-dynamic 和 --export-all-symbols 之间有什么区别?

使用 gcc 或 clang 在 Cygwin 上编译后,ld 抱怨

按照建议更改链接器标志可修复此行为,但我不确定这是否正确。因此问题很简单:

--export-dynamic和有什么区别--export-all-symbols

0 投票
1 回答
330 浏览

c - 如何在 IAR 编译器中按特定顺序放置变量?

我正在尝试将一些变量放入特定的 ROM lication 中。

在链接器配置文件中:

在源文件中:

生成的 .map 文件:

无论如何它都有效 - 变量位于正确的部分。

但是由于变量的大小,链接器已将其整理好。

有没有办法告诉链接器不要更改变量的顺序,所以它们会以与源文件中声明的顺序相同的顺序出现在映射文件中?

目标是:

0 投票
2 回答
940 浏览

c++ - 未使用的 C++ 静态成员函数/变量未优化

我启用了编译器和链接器优化,希望从我的 ARM32 可执行文件中删除所有未使用的代码/数据。从我的映射文件中,我可以看到确实丢弃了未使用的代码部分,因此优化标志大部分都在工作,除了未使用类的静态成员函数/变量。任何关于如何摆脱这种情况的想法都将不胜感激,因为这在资源受限的嵌入式平台上加起来相当多!

这是一个使用 g++ 7.5 编译的 MVCE。在 Ubuntu 18.04 上

使用优化标志编译以删除未使用的代码

检查静态成员变量是否被编译成可执行文件

0 投票
2 回答
324 浏览

c - 几个基本的 GCC 标志问题

我正在尝试编译并运行我的 C 程序。该程序使用线程。我正在使用带有 Ubuntu 终端的 WSL 运行 Windows 10。(也尝试使用 Ubuntu 虚拟机)这是我用于所有程序的“默认”Makefile 格式(更改每个程序的名称和标志)

这是我第一次在 C 中使用线程,这让我发现了 -pthread。我发现你需要将它添加到标志中(我用 CFLAGS 做了)。出于某种原因,当我在上面运行这个 makefile 时出现错误,找不到 pthread 函数,我注意到修复它的方法是通过更改这一行:

最后添加 pthread 。所有这一切都让我对标志进行了一些研究,在搜索 gcc 的手册页和谷歌之后,我发现这些问题没有简单的答案:

  1. 为什么我需要将 -pthread 添加到 .o 任务和 .c 任务?为什么仅将其添加到一个还不够?
  2. 什么是 -w 标志?我知道它代表“警告”,但 -w 和 -Wall 之间有什么区别?
  3. 什么是-I。旗帜?再次,我发现它代表“包含”,但我不确定它在做什么。我的 makefile 使用或不使用该标志。

谢谢你。

0 投票
0 回答
243 浏览

c++ - 将链接器参数添加到 gradle

我正在尝试使用 gradle 在 Linux 上编译和链接应用程序。编译部分工作正常,但是当它链接时,它会得到未定义的项目,因为链接器不包含库。我尝试了多种方法来添加它(见下文),但它们都不起作用。你知道我需要做什么来为喜欢的人包含库吗?

0 投票
1 回答
1683 浏览

linux - 为什么 gcc 默认与“-z now”链接,虽然惰性绑定是 ld 的默认值?

man ld有以下要说的-z lazy

...告诉动态链接器将函数调用解析推迟到调用函数时...延迟绑定是默认值

另一方面,gcc --verbose main.c传递-z now -z relro给 ld 的 main.c 为空main()

我在默认安装 gcc 的 Ubuntu 18.04 和 19.04 中看到了这一点。

所以-z lazy可能是 ld 的默认值,但是 gcc 在哪里/为什么将其更改为-z now -z relro

0 投票
1 回答
478 浏览

android - ld Mac OS 10.13.6:未知选项:-EL

我试图在我的 iMac 上编译 android linux 内核(4.4),但它一直显示这个错误,这里是完整的输出:

有什么想法可能导致这种情况吗?
提前致谢

0 投票
1 回答
46 浏览

makefile - 链接编辑器 (LD) 参数是什么意思?

我编写了 NASM(网络汇编器)程序,出于某些原因,我需要使用一些用 C 编写的函数。因此,我尝试使用ld链接编辑器将编译的 C 对象文件与编译的汇编对象链接起来。我是这样做的:

ld -m elf_x86_64 -lc --dynamic-linker=/lib64/ld-linux-x86-64.so.2 object_files -o program.

在我获得必要的参数之前,它不想链接和工作足够长的时间。现在,此参数集可以按预期工作。但我不明白-lcand的含义--dynamic-linker=/lib64/ld-linux-x86-64.so.2。他们在做什么 ?