This is an automated email from the ASF dual-hosted git repository.
janc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-newt.git
The following commit(s) were added to refs/heads/master by this push:
new 6cffebfe newt: Generate link tables header
6cffebfe is described below
commit 6cffebfefbe68d7360622c7465d8dc0faf0cca28
Author: Michal Gorecki <[email protected]>
AuthorDate: Mon Feb 19 18:02:56 2024 +0100
newt: Generate link tables header
Adding pkg.link_tables field with link tables names will result
in generation of link_tables.ld.h file which will be used
in auto-generated linker script.
---
newt/builder/extcmd.go | 41 +++++++++++++++++++++++++++++++++++++++++
newt/builder/targetbuild.go | 2 ++
newt/pkg/localpackage.go | 17 +++++++++++++++++
3 files changed, 60 insertions(+)
diff --git a/newt/builder/extcmd.go b/newt/builder/extcmd.go
index bcbb54e7..e28de1d4 100644
--- a/newt/builder/extcmd.go
+++ b/newt/builder/extcmd.go
@@ -184,6 +184,47 @@ func (t *TargetBuilder) execExtCmds(sf stage.StageFunc,
userSrcDir string,
return nil
}
+func getLinkTableEntry(name string) string {
+ indent := " "
+
+ entry := indent + "__" + name + "_start__ = .;\n" +
+ indent + "KEEP(*(." + name + "))\n" +
+ indent + "__" + name + "_end__ = .;\n\n"
+
+ return entry
+}
+
+func (t *TargetBuilder) generateLinkTables() {
+ var s []string
+
+ for _, pkg := range t.res.LpkgRpkgMap {
+ s = append(s, pkg.Lpkg.LinkTables()...)
+ }
+
+ if len(s) == 0 {
+ return
+ }
+
+ dir := GeneratedBaseDir(t.target.FullName()) + "/link/include"
+ err := os.MkdirAll(dir, os.ModePerm)
+ if err != nil {
+ log.Error("Generate link tables error:\n", err)
+ return
+ }
+
+ linkHeader, err := os.Create(dir + "/link_tables.ld.h")
+ if err != nil {
+ log.Error("Generate link tables error:\n", err)
+ return
+ }
+
+ for _, linkTable := range s {
+ linkHeader.WriteString(getLinkTableEntry(linkTable))
+ }
+
+}
+
+//link tables
// execPreBuildCmds runs the target's set of pre-build user commands. It is an
// error if any command fails (exits with a nonzero status).
func (t *TargetBuilder) execPreBuildCmds(workDir string) error {
diff --git a/newt/builder/targetbuild.go b/newt/builder/targetbuild.go
index dc54b68e..675d4e01 100644
--- a/newt/builder/targetbuild.go
+++ b/newt/builder/targetbuild.go
@@ -581,6 +581,8 @@ func (t *TargetBuilder) Build() error {
os.RemoveAll(workDir)
}()
+ t.generateLinkTables()
+
// Execute the set of pre-build user scripts.
if err := t.execPreBuildCmds(workDir); err != nil {
return err
diff --git a/newt/pkg/localpackage.go b/newt/pkg/localpackage.go
index 344633be..44d3208b 100644
--- a/newt/pkg/localpackage.go
+++ b/newt/pkg/localpackage.go
@@ -59,6 +59,8 @@ type LocalPackage struct {
// General information about the package
desc *PackageDesc
+ linkTables []string
+
// Extra package-specific settings that don't come from syscfg. For
// example, SELFTEST gets set when the newt test command is used.
injectedSettings *cfgv.Settings
@@ -145,6 +147,10 @@ func (pkg *LocalPackage) Desc() *PackageDesc {
return pkg.desc
}
+func (pkg *LocalPackage) LinkTables() []string {
+ return pkg.linkTables
+}
+
func (pkg *LocalPackage) SetName(name string) {
pkg.name = name
}
@@ -197,6 +203,15 @@ func (pkg *LocalPackage) readDesc(yc ycfg.YCfg)
(*PackageDesc, error) {
return pdesc, nil
}
+func (pkg *LocalPackage) readLinkTables(yc ycfg.YCfg) ([]string, error) {
+ var err error
+
+ sections, err := yc.GetValStringSlice("pkg.link_tables", nil)
+ util.OneTimeWarningError(err)
+
+ return sections, nil
+}
+
func (pkg *LocalPackage) sequenceString(key string) string {
var buffer bytes.Buffer
@@ -361,6 +376,8 @@ func (pkg *LocalPackage) Load() error {
return err
}
+ pkg.linkTables, err = pkg.readLinkTables(pkg.PkgY)
+
// Load syscfg settings.
pkg.SyscfgY, err = config.ReadFile(pkg.SyscfgYamlPath())
if err != nil && !util.IsNotExist(err) {