如何删除警告:link.res包含输出部分;你忘了-T吗?

问题描述 投票:0回答:4

我正在使用 fpc 编译器,我想删除此警告。我已经阅读了 fpc 的选项,但我找不到如何做到这一点。这可能吗? 当我运行命令时出现:

fpc foo.pas

输出:

目标操作系统:Linux for i386 编译 foo.pas 链接 p2 /usr/bin/ld: 警告:link.res 包含输出部分;你忘了-T吗? 79 编译行,0.1 秒

linux pascal ld fpc
4个回答
5
投票

这是某些 LD 版本中的错误。暂时忽略它,或者查看您的发行版是否有针对您的 LD 的更新。 (binutils 包)

http://www.freepascal.org/faq.var#unix-ld219


4
投票

这不是一个错误,因为

ld
的行为与其规范相似。
ld
2.28 的手册页内容如下:

如果链接器无法识别目标文件的格式,它将假定它是链接器脚本。 以这种方式指定的脚本增强了用于链接的主链接描述文件(默认链接描述文件或使用 -T 指定的链接描述文件)。 此功能允许链接器链接到看似对象或存档的文件,但实际上仅定义一些符号值,或使用“INPUT”或“GROUP”加载其他对象。 以这种方式指定脚本只是增加了主链接器脚本,并将额外的命令放置在主脚本之后;使用 -T 选项完全替换默认链接描述文件,但请注意“INSERT”命令的效果。

TL;博士☺。简而言之:在大多数情况下,用户不知道他们正在使用的链接器脚本,因为工具链提供了“主脚本”(= default script)。主脚本大量引用了编译器生成的部分的内在函数,您必须学习更改它的方法。大多数用户没有。

提供您自己的脚本的常见方法是通过

-T
选项。这样,主链接器脚本将被“忽略”,并且您的脚本将接管对链接的控制。但你必须从头开始编写所有内容。 如果您只想添加一个小功能,您可以将规格写入文件并将文件名附加到

ld

(或 gcc / g++)

不带
-T选项的命令行。这样,主链接器脚本仍然完成主要工作,但您的文件增强了它。如果您使用这种方法,您会收到该线程标头的消息,通知您可能无意中提供了损坏的对象。

造成这种混乱的根源在于无法指定附加文件的作用。这可以通过向

ld

添加另一个选项来轻松解决,就像“

d
efault scriptfile”的
-dT
选项一样:为“supplemental scriptfile”引入一个
-sT
选项。


1
投票

如果您的 binutils 版本有问题,我创建了一个快速程序来进行二进制修补

/usr/bin/ld

,以消除这个极其烦人的警告消息。

此程序可以另存为

main.go

并使用

sudo go run main.go
执行以修补
ld
。如果您的二进制文件放在其他地方,请记住先备份
ld
并修改主函数中的路径。

main.go

: package main import ( "bytes" "fmt" "io/ioutil" "os" ) // patchAway takes a filename and a string // If the string is found in the file, the first byte is // set to 0, to make the string zero length in C. func patchAway(filename, cstring string) error { data, err := ioutil.ReadFile(filename) if err != nil { return err } // Find the position of the warning pos := bytes.Index(data, []byte(cstring)) // If it does not exist, the file has most likely already been patched if pos == -1 { return fmt.Errorf("%s has already been patched", filename) } // Silence the message with a 0 byte data[pos] = 0 // Retrieve the permissions of the original file fi, err := os.Stat(filename) if err != nil { return err } perm := fi.Mode().Perm() // Write the patched data to the new file, but with the same permissions as the original file return ioutil.WriteFile(filename, data, perm) } func main() { filename := "/usr/bin/ld" warningMessage := "%P: warning: %s contains output sections" fmt.Printf("Patching %s... ", filename) if err := patchAway(filename, warningMessage); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } fmt.Println("ok") }



0
投票

sudo go run main.go

这是否解决了问题尚未确定。

© www.soinside.com 2019 - 2024. All rights reserved.