相关疑难解决方法(0)

x86-64 Linux中不再允许32位绝对地址?

64位Linux默认使用小内存模型,它将所有代码和静态数据置于2GB地址限制之下.这可确保您可以使用32位绝对地址.较旧版本的gcc使用静态数组的32位绝对地址,以便为相对地址计算保存额外的指令.但是,这不再有效.如果我尝试在汇编中创建一个32位的绝对地址,我会收到链接器错误:"在创建共享对象时,不能使用".data"重定位R_X86_64_32S;使用-fPIC重新编译".当然,此错误消息具有误导性,因为我没有创建共享对象,-fPIC也没有帮助.到目前为止我发现的是:gcc版本4.8.5对静态数组使用32位绝对地址,gcc版本6.3.0不使用.版本5可能也没有.binutils 2.24中的链接器允许32位绝对地址,而2.28则不允许.

这种变化的后果是必须重新编译旧库并破坏传统汇编代码.

现在我想问一下:这个改变是什么时候做的?它在某处记录了吗?是否有一个链接器选项,使其接受32位绝对地址?

linux gcc x86-64 linker-errors relocation

21
推荐指数
1
解决办法
5787
查看次数

Can't call C standard library function on 64-bit Linux from assembly (yasm) code

I have a function foo written in assembly and compiled with yasm and GCC on Linux (Ubuntu) 64-bit. It simply prints a message to stdout using puts(), here is how it looks:

bits 64

extern puts
global foo

section .data

message:
  db 'foo() called', 0

section .text

foo:
  push rbp
  mov rbp, rsp
  lea rdi, [rel message]
  call puts
  pop rbp
  ret
Run Code Online (Sandbox Code Playgroud)

It is called by a C program compiled with GCC:

extern void foo();

int main() {
    foo(); …
Run Code Online (Sandbox Code Playgroud)

c linux assembly x86-64 yasm

7
推荐指数
2
解决办法
276
查看次数

与GCC组装导致与.data有关的奇怪的重定位错误

这是一个以前没有发生过的问题.我很确信这可能是我的包装回购的一个问题(我最近重新安装了我的Arch系统,而这刚刚开始发生).

我在x86_64中写了一个小小的hello世界:

.data
str:    .asciz  "Test"

.text
.globl main
main:
    sub $8, %rsp
    mov $str, %rdi
    call puts
    add $8, %rsp
    ret
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用GCC进行汇编和链接 - 就像我过去做过很多次一样 - 简单地说:

gcc test.s -o test

然后输出此错误:

/ usr/bin/ld:/tmp/ccAKVV4D.o:在创建共享对象时,不能使用针对`.data'的重定位R_X86_64_32S; 使用-fPIC/usr/bin/ld重新编译:最终链接失败:输出collect2上的不可表示的部分:错误:ld返回1退出状态

这个错误从来没有发生在我身上.我试图通过谷歌搜索相同的错误消息解决问题,但它提出了具体的事情,而我认为这是一个普遍的问题.我已经尝试重新安装base-devel和整个GCC工具链.我不知道我还能做什么(请不要建议使用nasm,这是异端邪说).

我想我错过了一些明显的东西,但是我已经将GCC用于我的装配需求很长一段时间了.

assembly gcc gnu-assembler

3
推荐指数
1
解决办法
3235
查看次数

制作共享对象时不能使用针对 .data 的重定位 R_X86_64_32S(64 位 NASM + gcc)

我正在尝试使用 NASM 和 GCC 制作一个程序:

global main
extern puts

section .data
  hi db 'hello', 0

section .text
main:
  push hi
  call puts
  ret
Run Code Online (Sandbox Code Playgroud)

我正在构建:

nasm -f elf64 main.asm
gcc main.o -o main
rm main.o
Run Code Online (Sandbox Code Playgroud)

我得到:

/usr/bin/ld: main.o: relocation R_X86_64_32S against `.data' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

从像这样的示例中存在奇怪的堆栈操作来判断,我有一种感觉我做错了一些事情。不过,出于某种原因,我找不到任何实际解释这一点的文档(事实上,我几乎找不到任何使用 NASM 进行 64 位开发的有用文档,这使得我迄今为止所做的一切都成为真正的做起来很痛苦),并且添加类似的东西对我的错误输出没有任何影响。

更新:

我一直在看 …

c linux assembly libc nasm

3
推荐指数
1
解决办法
3792
查看次数

标签 统计

assembly ×3

linux ×3

c ×2

gcc ×2

x86-64 ×2

gnu-assembler ×1

libc ×1

linker-errors ×1

nasm ×1

relocation ×1

yasm ×1