Tag: 链接器

使用Go 1.5 buildmode = c-archive与从C链接的net / http.Server

即将发布的Go 1.5版本附带了新的构建模式 ,允许导出Go符号从C代码链接和调用。 我一直在玩它并得到基本的“Hello world”示例,但是现在我正在尝试链接一个启动net/http.Server的Go库并且它失败了。 代码看起来像这样( 它也可以在这里获得 ): gohttplib.go: package main import “C” import “net/http” //export ListenAndServe func ListenAndServe(caddr *C.char) { addr := C.GoString(caddr) http.ListenAndServe(addr, nil) } func main() {} 实例/ C / main.c中: #include #include “../../gohttplib.h” int main() { ListenAndServe(“:8000”); return 0; } 生成静态链接的对象和标头工作正常: $ go build -buildmode=c-archive 但是编译它是失败的: $ gcc -o gohttp-c examples/c/main.c […]

什么是GNU Linker中的部分链接?

我能找到的最佳解释来自官方文件: -r –relocateable生成可重定位输出 – 即生成一个输出文件,该输出文件又可以作为ld的输入。 这通常称为部分链接。 作为副作用,在支持标准Unix幻数的环境中,此选项还将输出文件的幻数设置为OMAGIC。 如果未指定此选项,则会生成绝对文件。 链接C ++程序时,此选项不会解析对构造函数的引用; 要做到这一点,请使用-Ur。 该选项与`-i’的作用相同。 我特别想知道链接器输入中出现的符号会发生什么。 当我有一个包含单个目标文件component.o的静态库libstatic.a时,请考虑具体情况。 现在,我想创建另一个静态库libfinal.a ,它将作为libstatic.a的接口。 我用这个命令来创建它: ld -r -o libfinal.a wrapper.o -L. -lstatic 其中wrapper.o提供了独有的API来调用libstatic.a中定义的函数 libfinal.a是否只是一个包含wrapper.o和component.o的组合存档,或者在wrapper.o和component.o之间可以解析的所有引用被解析(链接)然后放入libfinal.a ? Edit_1:根据所取得的进展更新问题:组件库libstatic.a ( objdump -D libstatic.a )的objdump -D libstatic.a分别为每个函数显示.text部分(如预期的那样)。 在组合库libfinal.a ,由部分链接( -r标志)创建,只有一个.text部分。 我想这意味着内部链接已经发生,而且不仅仅是创建一个普通的存档。

gcc共享库无法链接到glibc

我正在Linux 64bit下使用Eclipse CDT编写一个简单的C共享库。 代码对的rand()函数有一个引用它编译得很好但是在链接时报告来自链接器的以下错误: gcc -shared -o “libalg.so” ./sort.o /usr/bin/ld: ./sort.o: relocation R_X86_64_PC32 against undefined symbol `rand@@GLIBC_2.2.5′ can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Bad value sort.o是从文件编译的目标文件。 libalg.so是目标共享库名称。 谁能解释为什么会这样? 谢谢。

使用CMake打开链接器标志

当使用CMake生成VS2010目标时,我希望/ LTCG标志打开(如果可能的话,仅用于发布+ releasewithdebinfo,但是如果它打开调试则可以)。 如何修改链接器标志? add_definitions()不起作用,因为它只修改编译器标志。 是的,我把它包裹在if(MSVC)中。 如何修改链接器标志?

可执行文件中全局const变量的偏移量

希望有一个可执行文件通过修改自己的全局常量来保存其状态。 只是为了拥有一个完全独立的可执行文件。 想到的一些解决方案/黑客: 使用libelf并让程序解析自己以找到偏移量。 添加特定标记,然后在可执行文件中搜索它。 我想这甚至可能有点跨平台? 使用对象转储工具来确定可执行文件中的地址。 这可能需要始终作为项目构建的后期处理来完成。 让链接器提供此信息是很好的。 是否可以让链接器提供可执行文件中只读部分的偏移量? 谢谢

从Swift调用C ++函数

我应该如何从Swift文件中调用C ++函数(不涉及类)? 我试过这个: 在someCFunction.c中 : void someCFunction() { printf(“Inside the C function\n”); } void aWrapper() { someCplusplusFunction(); } 在someCpluplusfunction.cpp中 : void someCplusplusFunction() { printf(“Inside the C++ function”); } 在main.swift中 : someCFunction(); aWrapper(); 在Bridging-Header.h中 : #import “someCFunction.h” #import “someCplusplusFunction.h” 我发现这个答案非常有用,但我仍然无法使其发挥作用。 你能指出我正确的方向吗? 谢谢!

将某些编译器生成的变量强制转换为特定的ELF节(使用gcc)

我将从最终的问题开始:在C中使用gcc,是否有可能获得__func__ (或等效地, __FUNCTION__ )的值存储在除.rodata (或者任何地方-mrodata= points)或子部分之外的部分中其? 完整的解释: 假设我有一个记录宏: #define LOG(fmt, …) log_internal(__FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__) (当且仅当__VA_ARGS__列表为空时,在该一元上下文中使用的字符串连接运算符##使用前面的逗号,从而允许使用带或不带参数的格式字符串。) 然后我可以正常使用宏: void my_function(void) { LOG(“foo!”); LOG(“bar: %p”, &bar); } 可能打印(显然取决于log_internal的实现): foo.c:201(my_function) foo! foo.c:202(my_function) bar: 0x12345678 在这种情况下,格式字符串( “foo”和”bar: %p” )和预处理器字符串( “foo.c”和”my_function” )是匿名只读数据,它们会自动放入.rodata部分。 但是说我希望他们去另一个地方(我在一个嵌入式平台上运行几乎所有内存来自RAM以获得速度,但内存限制正在推动将一些东西转移到ROM中)。 移动__FILE__和格式字符串“很容易”: #define ROM_STR(str) (__extension__({static const __attribute__((__section__(“.rom_data”))) char __c[] = (str); (const char *)&__c;})) #define LOG(fmt, …) […]

从可执行文件中提取静态链接库

我不确定这是否可行,但是给定了一个可执行文件(foo.exe),其中有许多已静态链接的库。 是否有任何软件从该文件中提取可执行文件中的.lib(或.a)? 谢谢。

netdb.h没有正确链接

我正在尝试编译这个程序,如第19页的Beej网络编程指南中所述 。 #include #include #include #include int main() { int status; struct addrinfo hints; struct addrinfo *servinfo; /* Will point to the results */ memset(&hints, 0, sizeof hints); /* Make sure the struct is empty */ hints.ai_family = AF_UNSPEC; /* Don’t care IPv4 or IPv6 */ hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; if ((status = […]

链接器如何决定要包含哪些库?

假设库A有a()和b()。 如果我将程序B与A链接并调用a(),b()是否包含在二进制文件中? 编译器是否看到程序中的任何函数调用b()(可能a()调用b()或另一个lib调用b())? 如果是这样,编译器如何获取此信息? 如果没有,如果我链接到一个大型库但只使用次要function,这不是对最终编译大小的大浪费吗?