我从来没有把这个错误包含在我的旧linux机器上(两者都是intel 32bit),所以我很茫然.
我试图组装和链接汇编代码(这是非常简单的,应该工作),但是ld
给出了错误
rs.o: In function `_start':
(.text+0x11): undefined reference to `eax'
Run Code Online (Sandbox Code Playgroud)
有问题的pushl %eax
线是线.我只需要将0的单个字节推送到堆栈,所以我决定使用xor'd eax
寄存器.但是在使用代码组装时pushb
给了我一个" 无效后缀或操作数推送 "错误,如果我尝试使用汇编很好但链接器对我大喊大叫.as
pushb %al
pushl %eax
as
这是代码.
.section .data
.section .text
.global _start
_start:
xorl %eax, %eax
#sys_socketcall(int call, __user *args)
#sys_socket(int domain, int type, int protocol)
pushl %eax #protocol: 0
pushl $1 #type: SOCK_STREAM
pushl $2 #domain: AF_INET
movL $1, %ebx #sys_socket
movl $102, %eax #sys_socketcall
int $0x80
movl $eax, %ebx #move socket fd to …
Run Code Online (Sandbox Code Playgroud) 我在 Linux 上使用 gcc 并为静态库创建共享库。我不想导出某些静态库中的符号。
gcc版本是4.8.0。
我在命令中尝试此选项gcc
,但它不起作用:
-Wl,--排除库,libabc.a 。
如果我使用此选项,它将删除所有不是我想要的符号:
-Wl,--排除库,全部
有人可以帮助如何使用--exclude-option
而不是从特定静态库导出符号吗?
谢谢钱德拉
我正在尝试编译一个程序,但在配置检查期间找不到一个库。将我的 .bashrc 文件链接到这个库:
LD_LIBRARY_PATH=/usr/lib/:/users/much/needed/library/:$LD_LIBRARY_PATH:/path/to/other/libs/
export LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
之后,我使用了 .bashrc 文件
source ~/.bashrc
Run Code Online (Sandbox Code Playgroud)
并检查 echo $LD_LIBRARY_PATH 以查看 LD_LIBRARY_PATH 是否包含我需要的库的路径(它就在那里)。
但是,当我再次运行 ./configure 时 - 出现相同的错误。您对这里可能出现的问题有什么提示吗?我找不到任何问题...
我找不到谷歌的直接答案,因为我很长一段时间都没有在Linux上做过什么希望在这里找到帮助.在构建共享对象时,我在Ubuntu上遇到链接错误.链接器告诉我-fPIC
即使我已经设置-fPIC
了所有源文件,我也应该重新编译.输出make
:
mkdir -p ../_Bin/Debug/HttpClientApi
g++ -fPIC -pedantic -Wall -Wextra -std=c++11 -c CentralServerClient.cpp -o ../_Bin/Debug/HttpClientApi/CentralServerClient.o
CentralServerClient.cpp:4:80: warning: unused parameter ‘pEventListener’ [-Wunused-parameter]
void CCentralServerClient::AddEventListener(ICentralServerClientEventListener* pEventListener)
^
CentralServerClient.cpp:29:83: warning: unused parameter ‘pEventListener’ [-Wunused-parameter]
void CCentralServerClient::RemoveEventListener(ICentralServerClientEventListener* pEventListener)
^
g++ -fPIC -pedantic -Wall -Wextra -std=c++11 -c HttpRequest.cpp -o ../_Bin/Debug/HttpClientApi/HttpRequest.o
g++ -fPIC -pedantic -Wall -Wextra -std=c++11 -c HttpResponse.cpp -o ../_Bin/Debug/HttpClientApi/HttpResponse.o
g++ -fPIC -pedantic -Wall -Wextra -std=c++11 -c IOService.cpp -o ../_Bin/Debug/HttpClientApi/IOService.o
g++ -Wl,-shared -Wl,-v -Wl,-g -o ../_Bin/Debug/HttpClientApi.so ../_Bin/Debug/HttpClientApi/CentralServerClient.o ../_Bin/Debug/HttpClientApi/HttpRequest.o ../_Bin/Debug/HttpClientApi/HttpResponse.o ../_Bin/Debug/HttpClientApi/IOService.o …
Run Code Online (Sandbox Code Playgroud) 正如我所见,extern
汇编代码中的WinAPI函数具有类似的名称_ExitProcess@4
.
该@4
部分的含义是什么,以及如何确定之后使用的数字@
?
我知道这与我们链接的DLL有关,但在很多情况下,不知道在使用后使用的是什么数字@
,这会导致许多令人讨厌的undefined reference
错误.
我有一个带有_start
标签的程序集文件,作为该.text
段中的第一件事.我希望这个标签成为我申请的入口点.
每当我将这个文件与另一个调用了函数的文件一起传递时main
,main
无论如何,该函数最终都成为我的应用程序的入口点.
我正在使用GNU链接器并尝试了-e _start
标志,同时更改了输入文件顺序.只要存在一个main
函数,它就会成为入口点.如果我重命名该main
函数,它工作正常,我的_start
标签成为入口点.
编辑:好像是因为-O2
编译器的标志.
屁股
.text
.global _start
_start:
jmp main
Run Code Online (Sandbox Code Playgroud)
main.c中
int main(){
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编
gcc -O2 -c as.s -o as.o
gcc -O2 -c main.c -o main.o
ld -e _start as.o main.o -o test
Run Code Online (Sandbox Code Playgroud)
产量
00000000004000b0 <main>:
4000b0: 31 c0 xor %eax,%eax
4000b2: c3 retq
00000000004000b3 <_start>:
4000b3: e9 f8 ff ff ff jmpq 4000b0 <main>
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有两个类Triangle
,ALine
我想在其构造函数中ALine
为属性分配新实例Triangle
.但是我收到了这个错误
Undefined symbols for architecture x86_64:
"ALine::ALine()", referenced from:
Triangle::Triangle(triangle) in Triangle.o
ld: symbol(s) not found for architecture x86_64
Run Code Online (Sandbox Code Playgroud)
以下是我写的代码:
#include "Geometry.h"
#include "ALine.h"
ALine::ALine(point a, point b)
{
double tmpy = a.y - b.y;
double tmpx = a.x - b.x;
double tmpk;
if(equals(tmpy, 0))
{
tmpk = 0;
}
else
{
tmpk = tmpx/tmpy;
}
double tmpq = a.y - tmpk*a.x;
if(equals(tmpx, 0))
{
if(equals(a.x, 0))
{
if(equals(b.x, 0)) tmpk …
Run Code Online (Sandbox Code Playgroud)