小编ole*_*ole的帖子

在 MacOSX 上静态链接时找不到符号

我正在尝试创建一个静态库并将其链接到 MacOS X(几个版本):文件foo.c

char foo[111];
Run Code Online (Sandbox Code Playgroud)

文件bar.c

#include <string.h>

extern char foo[];

int bar(char *src) {
  strcpy(foo, src);
  return strlen(foo);
}
Run Code Online (Sandbox Code Playgroud)

创建一个库:

$ cc -c foo.c bar.c
$ ar r libfoobar.a foo.o bar.o
ar: creating archive libfoobar.a
$ ranlib libfoobar.a 
$ nm libfoobar.a 

libfoobar.a(foo.o):
000000000000006f C _foo

libfoobar.a(bar.o):
                 U ___strcpy_chk
0000000000000000 T _bar
                 U _foo
                 U _strlen
Run Code Online (Sandbox Code Playgroud)

创建一个小测试程序:

文件main.c

#include <stdio.h>

int bar(char *);

int main(void) {
  printf("foobarbar = %i\n", bar("123"));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译并链接: …

linker clang static-libraries

6
推荐指数
1
解决办法
1146
查看次数

如何创建不可重定位符号

如何使用最近的gcc(启用PIC)创建不可重定位的符号?我基本上想让以下C程序打印NULL:

#include <stdio.h>

extern int mem_;

int main(void) {
  printf("%p\n", &mem_);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我试过的是一个小的汇编文件:

    .data
    .globl  mem_
    .type mem_,@object
    .set mem_, 0
Run Code Online (Sandbox Code Playgroud)

但这会创建一个可重定位的符号,该符号在运行时不具有值0。

背景:我正在尝试运行一个旧程序,该程序使用此技巧直接从Fortran作为数组访问(分配)内存。由于该程序有“ 10”?LOC,重写所有内容是不可行的。

[编辑] GNU汇编器手册将“绝对部分”记录

绝对部分:该部分的地址0始终“重定位”到运行时地址0。如果要引用的地址在重定位时ld不得更改,则此方法很有用。从这个意义上讲,我们说绝对地址是“无法重定位”的:它们在重定位期间不会改变。

这可能是我在这里需要的(对吗?),但是我找不到启用此部分的方法。该.struct指令记录为切换到“绝对部分”;但是以下汇编程序也不起作用:

    .globl  mem_
    .struct 0
mem_:   
Run Code Online (Sandbox Code Playgroud)

符号出现在此情况下,*ABS*objdump

$ objdump -t memc

memc:     file format elf64-x86-64
[...]
0000000000000540 g     F .text  000000000000002b              _start
0000000000201030 g       .bss   0000000000000000              __bss_start
000000000000064a g     F .text  000000000000003c              main
0000000000000000 g       *ABS*  0000000000000000              mem_
[...]
Run Code Online (Sandbox Code Playgroud)

但它仍然被迁移。

assembly linker

4
推荐指数
1
解决办法
363
查看次数

标签 统计

linker ×2

assembly ×1

clang ×1

static-libraries ×1